master
LuisCorGon 3 months ago
commit 5d63a8387f

3
.idea/.gitignore vendored

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile default="true" name="Default" enabled="true" />
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="prematricula" />
</profile>
</annotationProcessing>
</component>
<component name="JavacSettings">
<option name="ADDITIONAL_OPTIONS_OVERRIDE">
<module name="prematricula" options="-parameters" />
</option>
</component>
</project>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/matricula/src/main/java" charset="UTF-8" />
</component>
</project>

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
</component>
</project>

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/matricula/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_18" default="true" project-jdk-name="corretto-18" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/matricula-master.iml" filepath="$PROJECT_DIR$/.idea/matricula-master.iml" />
</modules>
</component>
</project>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

@ -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/

Binary file not shown.

@ -0,0 +1,2 @@
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.5/apache-maven-3.9.5-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar

308
matricula/mvnw vendored

@ -0,0 +1,308 @@
#!/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.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Apache Maven Wrapper startup batch script, version 3.2.0
#
# Required ENV vars:
# ------------------
# JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
# 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
JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME
else
JAVA_HOME="/Library/Java/Home"; export JAVA_HOME
fi
fi
;;
esac
if [ -z "$JAVA_HOME" ] ; then
if [ -r /etc/gentoo-release ] ; then
JAVA_HOME=$(java-config --jre-home)
fi
fi
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
[ -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 "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] &&
JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); 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 2>/dev/null; \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
# 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/.." || exit 1; pwd)
fi
# end of workaround
done
printf '%s' "$(cd "$basedir" || exit 1; pwd)"
}
# concatenates all lines of a file
concat_lines() {
if [ -f "$1" ]; then
# Remove \r in case we run on Windows within Git Bash
# and check out the repository with auto CRLF management
# enabled. Otherwise, we may read lines that are delimited with
# \r\n and produce $'-Xarg\r' rather than -Xarg due to word
# splitting rules.
tr -s '\r\n' ' ' < "$1"
fi
}
log() {
if [ "$MVNW_VERBOSE" = true ]; then
printf '%s\n' "$1"
fi
}
BASE_DIR=$(find_maven_basedir "$(dirname "$0")")
if [ -z "$BASE_DIR" ]; then
exit 1;
fi
MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR
log "$MAVEN_PROJECTBASEDIR"
##########################################################################################
# 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.
##########################################################################################
wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar"
if [ -r "$wrapperJarPath" ]; then
log "Found $wrapperJarPath"
else
log "Couldn't find $wrapperJarPath, downloading it ..."
if [ -n "$MVNW_REPOURL" ]; then
wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
else
wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
fi
while IFS="=" read -r key value; do
# Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' )
safeValue=$(echo "$value" | tr -d '\r')
case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;;
esac
done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
log "Downloading from: $wrapperUrl"
if $cygwin; then
wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath")
fi
if command -v wget > /dev/null; then
log "Found wget ... using wget"
[ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet"
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
else
wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
fi
elif command -v curl > /dev/null; then
log "Found curl ... using curl"
[ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent"
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
else
curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
fi
else
log "Falling back to using Java to download"
javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java"
javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class"
# For Cygwin, switch paths to Windows format before running javac
if $cygwin; then
javaSource=$(cygpath --path --windows "$javaSource")
javaClass=$(cygpath --path --windows "$javaClass")
fi
if [ -e "$javaSource" ]; then
if [ ! -e "$javaClass" ]; then
log " - Compiling MavenWrapperDownloader.java ..."
("$JAVA_HOME/bin/javac" "$javaSource")
fi
if [ -e "$javaClass" ]; then
log " - Running MavenWrapperDownloader.java ..."
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath"
fi
fi
fi
fi
##########################################################################################
# End of extension
##########################################################################################
# If specified, validate the SHA-256 sum of the Maven wrapper jar file
wrapperSha256Sum=""
while IFS="=" read -r key value; do
case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;;
esac
done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
if [ -n "$wrapperSha256Sum" ]; then
wrapperSha256Result=false
if command -v sha256sum > /dev/null; then
if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then
wrapperSha256Result=true
fi
elif command -v shasum > /dev/null; then
if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then
wrapperSha256Result=true
fi
else
echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available."
echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties."
exit 1
fi
if [ $wrapperSha256Result = false ]; then
echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2
echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2
echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2
exit 1
fi
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 "$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
# shellcheck disable=SC2086 # safe args
exec "$JAVACMD" \
$MAVEN_OPTS \
$MAVEN_DEBUG_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

205
matricula/mvnw.cmd vendored

@ -0,0 +1,205 @@
@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 Apache Maven Wrapper startup batch script, version 3.2.0
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@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 WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperUrl" SET WRAPPER_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 WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
)
if "%MVNW_VERBOSE%" == "true" (
echo Couldn't find %WRAPPER_JAR%, downloading it ...
echo Downloading from: %WRAPPER_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('%WRAPPER_URL%', '%WRAPPER_JAR%')"^
"}"
if "%MVNW_VERBOSE%" == "true" (
echo Finished downloading %WRAPPER_JAR%
)
)
@REM End of extension
@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file
SET WRAPPER_SHA_256_SUM=""
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B
)
IF NOT %WRAPPER_SHA_256_SUM%=="" (
powershell -Command "&{"^
"$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^
"If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^
" Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^
" Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^
" Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^
" exit 1;"^
"}"^
"}"
if ERRORLEVEL 1 goto error
)
@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%

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.proyecto</groupId>
<artifactId>prematricula</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>prematricula</name>
<description>Proyecto de la prematricula</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>3.2.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

@ -0,0 +1,20 @@
package com.proyecto.prematricula;
import com.proyecto.prematricula.modelos.Alumno;
import com.proyecto.prematricula.repositorio.AlumnoRepositorio;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class PrematriculaApplication {
public static void main(String[] args) {
SpringApplication.run(PrematriculaApplication.class, args);
}
}

@ -0,0 +1,16 @@
/*package com.proyecto.prematricula.configuracion;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
public class NoCacheInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", "0");
return true;
}
}*/

@ -0,0 +1,15 @@
/*package com.proyecto.prematricula.configuracion;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
WebMvcConfigurer.super.addInterceptors(registry);
}
}*/

@ -0,0 +1,797 @@
package com.proyecto.prematricula.controlador;
import com.proyecto.prematricula.email.EmailBody;
import com.proyecto.prematricula.email.EmailPort;
import com.proyecto.prematricula.enums.CursosEnum;
import com.proyecto.prematricula.modelos.*;
import com.proyecto.prematricula.servicios.Alumno.AlumnoService;
import com.proyecto.prematricula.servicios.Ciclo.CicloService;
import com.proyecto.prematricula.servicios.Curso.CursoService;
import com.proyecto.prematricula.servicios.CursoCiclo.CursoCicloService;
import com.proyecto.prematricula.servicios.Edu.EduService;
import com.proyecto.prematricula.servicios.Estadisticas.EstadisticasService;
import com.proyecto.prematricula.servicios.Familia.FamiliaService;
import com.proyecto.prematricula.servicios.Matriculacion.MatriculacionService;
import com.proyecto.prematricula.servicios.Modulo.ModuloService;
import com.proyecto.prematricula.servicios.Optativas.OptativasService;
import com.proyecto.prematricula.servicios.Patologia.PatologiaService;
import jakarta.servlet.http.HttpSession;
import org.springframework.aop.AopInvocationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import java.text.SimpleDateFormat;
import java.util.*;
@Controller
public class AlumnoController {
@Value("${es.matricula}")
private boolean esMatricula;
@Autowired
private EstadisticasService estadisticasService;
@Autowired
private AlumnoService alumnoService;
@Autowired
private EduService eduService;
@Autowired
private FamiliaService familiaService;
@Autowired
private CicloService cicloService;
@Autowired
private CursoService cursoService;
@Autowired
private CursoCicloService cursoCicloService;
@Autowired
private MatriculacionService matriculacionService;
@Autowired
private ModuloService moduloService;
@Autowired
private PatologiaService patologiaService;
@Autowired
private OptativasService optativasService;
@Autowired
private EmailPort emailPort;
@GetMapping
public String home(Model model) {
return "redirect:/registro";
}
@GetMapping("/registro")
public String registro(Model model) {
model.addAttribute(esMatricula);
return "registro";
}
@PostMapping("/registro/comprobarNia")
public String comprobarNia(Alumno alumno, HttpSession session, RedirectAttributes redirectAttributes) {
try {
Alumno alumnoActual = alumnoService.getAlumnoByNia(alumno.getNia());
if (alumnoActual != null && alumnoActual.getContrasenya().equals(alumno.getContrasenya())) {
session.setAttribute("alumnoActual", alumnoActual);
session.removeAttribute("alumno");
return "redirect:/esRepetidor";
} else if (alumnoActual == null) {
redirectAttributes.addFlashAttribute("errorNia", "El NIA ingresado no existe.");
} else {
redirectAttributes.addFlashAttribute("errorContraseña", "La contraseña ingresada es incorrecta.");
}
} catch (Exception e) {
System.out.println("ERROR" + e.getMessage());
}
return "redirect:/registro";
}
@GetMapping("/esRepetidor")
public String esRepetidor(HttpSession session,Model model, RedirectAttributes redirectAttributes){
Alumno alumnoActual = (Alumno) session.getAttribute("alumnoActual");
if (alumnoActual == null) {
return "redirect:/registro";
}
int idMatricula = matriculacionService.getMatriculacionByIdAlumno(alumnoActual.getId());
if (idMatricula!= 0) {
session.setAttribute("idMatricula", idMatricula);
return "redirect:/existeMatriculacion";
}
String mensaje = (String) redirectAttributes.getAttribute("mensaje");
if (mensaje != null) {
redirectAttributes.addFlashAttribute(mensaje);
redirectAttributes.addAttribute("mensaje", null);
}
if (alumnoActual.getMatCurso() == 3 ){
model.addAttribute("esTercero", true);
session.setAttribute("esTercero", true);
} else if (alumnoActual.getMatCurso() == 4) {
model.addAttribute("esCuarto", true);
}
Matriculacion matriculacion = new Matriculacion();
session.setAttribute("matriculacion", matriculacion);
session.setAttribute("esBachiller", false);
model.addAttribute("alumno", alumnoActual);
return "es_repetidor";
}
@PostMapping("/redireccionRepetidor")
public String redireccionRepetidor(HttpSession session,
@RequestParam(name = "esRepetidor", required = false) String esRepetidor,
@RequestParam(name = "opcion1", required = false) String esPDC) {
Alumno alumnoActual = (Alumno) session.getAttribute("alumnoActual");
if (alumnoActual == null) {
return "redirect:/registro";
}
boolean boolesRep;
if (esRepetidor == null){
boolesRep = true;
} else boolesRep = esRepetidor.equals("true");
if (!boolesRep && (alumnoActual.getMatFamilia().equals("FP") && alumnoActual.getMatCurso() == 2) ||
filtrarLetras(alumnoActual.getMatActual()).equals("CESA") && !boolesRep){
return "redirect:/registro";
}
session.setAttribute("esRepetidor", boolesRep);
boolean boolesPDC;
if (esPDC == null){
boolesPDC = false;
} else boolesPDC = esPDC.equals("si");
System.out.println("ES PDC ESTE ALUMNO?:" + boolesPDC);
session.setAttribute("esPDC", boolesPDC);
if (alumnoActual.getMatFamilia().equals("BAC") || alumnoActual.getMatFamilia().equals("FP") ||
(alumnoActual.getMatCurso() == 4 && !boolesRep)) {
return "redirect:/ciclo";
}
return "redirect:/completado";
}
/* @GetMapping("/principal")
public String principal(HttpSession session, Model model) {
Alumno alumnoActual = (Alumno) session.getAttribute("alumnoActual");
if (alumnoActual == null) {
return "redirect:/registro";
}
model.addAttribute("alumno", alumnoActual);
List<Edu> edus = eduService.getAllEdu();
model.addAttribute("edus", edus);
return "principal";
}*/
/*@GetMapping("/familia")
public String familia(HttpSession session, Model model, @RequestParam(name = "edu", required = false) String eduSeleccionado) {
Alumno alumnoActual = (Alumno) session.getAttribute("alumnoActual");
if (alumnoActual == null) {
return "redirect:/registro";
}
model.addAttribute("alumno", alumnoActual);
Edu edu = eduService.getEduByNombre(eduSeleccionado);
if (edu != null){
session.setAttribute("edu", edu);
} else {
edu = (Edu) session.getAttribute("edu");
}
model.addAttribute("eduSeleccionado", edu.getNombre());
List<Familia> familias = familiaService.getFamiliasByIdEdu(edu.getId());
model.addAttribute("familias", familias);
return "familia";
}*/
@GetMapping("/ciclo")
public String ciclo(HttpSession session, Model model, @RequestParam(name = "fam", required = false) String familiaSeleccionada) {
Alumno alumnoActual = (Alumno) session.getAttribute("alumnoActual");
if (alumnoActual == null) {
return "redirect:/registro";
}
model.addAttribute("alumno", alumnoActual);
/*Familia familia = familiaService.getFamiliaByNombre(familiaSeleccionada);
if (familia != null){
session.setAttribute("familia", familia) ;
} else
{
familia = (Familia) session.getAttribute("familia");
}
model.addAttribute("familiaSeleccionada", familia.getNombre());*/
boolean esRepetidor = (boolean) session.getAttribute("esRepetidor");
List<Ciclo> ciclos = new ArrayList<>();
if (alumnoActual.getMatFamilia().equals("BAC") ||
(alumnoActual.getMatCurso() == 4 && !esRepetidor)){
ciclos = cicloService.getCiclosBach();
session.setAttribute("esBachiller", true);
model.addAttribute("informacion", "Selecciona el bachillerato sobre el que te quieres formar");
model.addAttribute("esBachiller", true);
} else if (alumnoActual.getMatFamilia().equals("FP")){
String codigoAlumno = filtrarLetras(alumnoActual.getMatActual());
ciclos = cicloService.findCicloByCodigoDos(codigoAlumno);
model.addAttribute("informacion", "Confirma tu ciclo formativo seleccionándolo.");
if (ciclos == null){
System.out.println("NO SE HAN ENCONTRADO LOS CICLOS");
}
}
model.addAttribute("ciclos", ciclos);
return "ciclo";
}
private String filtrarLetras(String code) {
StringBuilder letters = new StringBuilder();
for (char ch : code.toCharArray()) {
if (Character.isLetter(ch)) {
letters.append(ch);
}
}
return letters.toString();
}
/*@GetMapping("/curso")
public String curso(HttpSession session, Model model, @RequestParam(name = "cic", required = false) String cicloSeleccionado) {
Alumno alumnoActual = (Alumno) session.getAttribute("alumnoActual");
if (alumnoActual == null) {
return "redirect:/registro";
}
model.addAttribute("alumno", alumnoActual);
Ciclo ciclo = cicloService.getCicloByNombre(cicloSeleccionado);
if (ciclo != null){
session.setAttribute("ciclo", ciclo);
} else {
ciclo = (Ciclo) session.getAttribute("ciclo");
}
model.addAttribute("cicloSeleccionado", ciclo.getNombre());
List<Curso> cursos = cursoCicloService.getCursoByIdCiclo(ciclo.getId());
model.addAttribute("cursos", cursos);
return "curso";
}*/
@GetMapping("/completado")
private String completado(@RequestParam(name = "cic", required = false) String cicloSeleccionado, HttpSession session){
Alumno alumnoActual = (Alumno) session.getAttribute("alumnoActual");
if (alumnoActual != null){
Ciclo ciclo = null;
Curso curso;
CursoCiclo cursoCiclo;
boolean esRepetidor = (boolean) session.getAttribute("esRepetidor");
//Conseguimos el ciclo dependiendo de si se trata de un ciclo de bachiller o una eso o fp.
if (cicloSeleccionado != null){
ciclo = cicloService.getCicloByNombre(cicloSeleccionado);
} else {
//Siempre será la ESO, ya que fp y bach irán por arriba
ciclo = cicloService.getCicloByCodigo(alumnoActual.getMatFamilia());
}
//Conseguimos el curso, dependiendo de si es repetidor o de si viene de la eso
if (esRepetidor){
curso = cursoService.getCursoByNombre(CursosEnum.getNombreByNumero(alumnoActual.getMatCurso()));
} else if (alumnoActual.getMatCurso() == 4 || (alumnoActual.getMatFamilia().equals("FP") &&
alumnoActual.getMatCurso() == 2)) {
curso = cursoService.getCursoByNombre(CursosEnum.getNombreByNumero(1));
} else {
curso = cursoService.getCursoByNombre(CursosEnum.getNombreByNumero(alumnoActual.getMatCurso()+1));
}
cursoCiclo = cursoCicloService.findByCursoIdAndCicloId(curso.getId(), ciclo.getId());
System.out.println("ESTE ES EL CURSO CICLO " + cursoCiclo.getId());
session.setAttribute("cursoCiclo", cursoCiclo);
if (alumnoActual.getMatFamilia().equals("FP")){
if (esMatricula){
return "redirect:/extra";
} else {
return "redirect:/finalYResumen";
}
} else {
return "redirect:/optativas";
}
}
return "redirect:/registro";
}
@GetMapping("/extra")
private String extra(HttpSession session, Model model){
Alumno alumnoActual = (Alumno) session.getAttribute("alumnoActual");
if (alumnoActual == null) {
return "redirect:/registro";
}
model.addAttribute("alumno", alumnoActual);
List<Patologia> patologias = patologiaService.getAllPatologias();
model.addAttribute("patologias", patologias);
return "extra";
}
@GetMapping("/optativas")
private String optativas(HttpSession session, Model model){
Alumno alumnoActual = (Alumno) session.getAttribute("alumnoActual");
if (alumnoActual == null) {
return "redirect:/registro";
}
model.addAttribute("esBachiller", session.getAttribute("esBachiller"));
CursoCiclo cursoCiclo = (CursoCiclo) session.getAttribute("cursoCiclo");
boolean esPDC = (boolean) session.getAttribute("esPDC");
boolean esCuarto;
if (cursoCiclo.getCurso().getId() == 4 && !esPDC){
esCuarto = true;
}else {
esCuarto = false;
}
model.addAttribute("esCuarto", esCuarto);
boolean esTercero;
if (cursoCiclo.getCurso().getId() == 3){
esTercero = true;
} else
esTercero = false;
model.addAttribute("esTercero", esTercero);
boolean esRepetidor = (boolean) session.getAttribute("esRepetidor");
model.addAttribute("esRepetidor", esRepetidor);
model.addAttribute("alumno", alumnoActual);
model.addAttribute("cursoCiclo", cursoCiclo);
List<Modulo> modulos = moduloService.findByIdCursoCicloAndBloque(cursoCiclo.getId(), 0);
if (cursoCiclo.getCiclo().getCodigo().equals("ESO") ) {
modulos.addAll(moduloService.findByIdCursoCicloAndBloque(cursoCiclo.getId(), 6));
if (esRepetidor) {
modulos.removeIf(modulo -> modulo.getBloque() == 0);
}
List<Modulo> bloque4 = moduloService.findByIdCursoCicloAndBloque(cursoCiclo.getId(), 4);
model.addAttribute("bloques4", bloque4);
}
List<Modulo> bloque1 = null;
List<Modulo> bloque2 = null;
if (esCuarto){
bloque1 = moduloService.findModuloByBloque(1);
bloque2 = moduloService.findModuloByBloque(2);
List<Modulo> bloque3 = moduloService.findModuloByBloque(3);
List<Modulo> bloque5 = moduloService.findModuloByBloque(5);
List<Modulo> bloqueExtItinerario = moduloService.findBloqueExtItinerario(1, 2, 3);
model.addAttribute("bloques3", bloque3);
model.addAttribute("bloques5", bloque5);
model.addAttribute("bloqueExtItinerario", bloqueExtItinerario);
}
if (cursoCiclo.getCiclo().getFamilia().getNombre().equals("Batxillerat")){
session.setAttribute("esBachiller", true);
int bloque = 0;
switch (cursoCiclo.getCiclo().getCodigo()){
case "BAC":
if (cursoCiclo.getCurso().getNombre().equals("PRIMERO")){
bloque = 7;
bloque1 = moduloService.findModuloByBloque(14);
} else {
bloque = 9;
bloque1 = moduloService.findModuloByBloque(15);
bloque2 = moduloService.findModuloByBloque(16);
}
break;
case "BAH":
if (cursoCiclo.getCurso().getNombre().equals("PRIMERO")){
bloque = 8;
bloque1 = moduloService.findModuloByBloque(12);
bloque2 = moduloService.findModuloByBloque(13);
} else {
bloque = 10;
bloque1 = moduloService.findModuloByBloque(11);
}
break;
}
model.addAttribute("obligatorias", moduloService.findModuloByBloque(bloque));
}
model.addAttribute("bloques1", bloque1);
model.addAttribute("bloques2", bloque2);
model.addAttribute("modulos", modulos);
return "optativas";
}
@PostMapping("/actualizarOptativas")
private String actualizarOptativas(Model model,
@RequestParam("opcionesSeleccionadas") String[] opcionesSeleccionadas,
@RequestParam(value = "extItinerario", required = false) String extItinerario,
@RequestParam(value = "optPasada", required = false ) String optativaPasada,
HttpSession session){
Alumno alumnoActual = (Alumno) session.getAttribute("alumnoActual");
if (alumnoActual == null) {
return "redirect:/registro";
}
Matriculacion matriculacion = (Matriculacion) session.getAttribute("matriculacion");
CursoCiclo cursoCiclo = (CursoCiclo) session.getAttribute("cursoCiclo");
List<Optativas> optativasList = new ArrayList<>();
Optativas optativa;
int orden;
System.out.println("ESTAS SON LAS OPCIONES SELECCIONADAS: " + Arrays.toString(opcionesSeleccionadas));
for (int i = 0; i < opcionesSeleccionadas.length -1; i++){
Modulo modulo = moduloService.findByNombre(opcionesSeleccionadas[i], alumnoActual, cursoCiclo);
orden = i+1;
if (modulo.isEsItinerario() || modulo.getBloque() == 4 || modulo.getBloque() > 6){
orden = 0;
}
optativa = new Optativas(orden, matriculacion, modulo);
optativasList.add(optativa);
}
boolean esPDC = (boolean) session.getAttribute("esPDC");
if (esPDC && cursoCiclo.getCurso().getId() == 4){
for (Modulo modulo : moduloService.findListPDC4()){
optativasList.add(new Optativas(0, matriculacion, modulo));
}
}
session.setAttribute("optativasList", optativasList);
session.setAttribute("extItinerario", extItinerario);
session.setAttribute("optPasada", optativaPasada);
if (esMatricula){
return "redirect:/extra";
} else {
return "redirect:/finalYResumen";
}
}
@PostMapping("/actualizarAlumno")
private String actualizarAlumno(HttpSession session,
@RequestParam("opcion2") String opcion2, @RequestParam("opcion3") String opcion3,
@RequestParam("limitaciontxt") String limitaciontxt,
@RequestParam("patologiaSeleccionada") String patologiaSeleccionada,
@RequestParam("medicaciontxt") String medicaciontxt,
@RequestParam("madretxt") String madretxt,
@RequestParam("parentescotxt") String parentesctotxt
)
{
Alumno alumnoActual = (Alumno) session.getAttribute("alumnoActual");
if (alumnoActual == null) {
return "redirect:/registro";
}
boolean esRepetidor = (boolean) session.getAttribute("esRepetidor");
alumnoActual.setEsRepetidor(esRepetidor);
boolean esAmpa = opcion2.equals("si");
alumnoActual.setAmpa(esAmpa);
boolean esLimitacion = opcion3.equals("si");
alumnoActual.setLimitacion(esLimitacion);
alumnoActual.setTxtLimitacion(limitaciontxt);
alumnoActual.setPatologia(patologiaService.getPatologiaByNombre(patologiaSeleccionada));
alumnoActual.setMedicacion(medicaciontxt);
alumnoActual.setNombreApellidoMadre(madretxt);
alumnoActual.setParentesco(parentesctotxt);
alumnoService.guardarAlumno(alumnoActual);
return "redirect:/finalYResumen";
}
@GetMapping("/finalYResumen")
private String finalYResumen(HttpSession session, Model model, RedirectAttributes redirectAttributes){
Alumno alumnoActual = (Alumno) session.getAttribute("alumnoActual");
if (alumnoActual == null) {
return "redirect:/registro";
}
model.addAttribute("esMatricula");
CursoCiclo cursoCiclo = (CursoCiclo) session.getAttribute("cursoCiclo");
Date fechaHoraActual = new Date();
String optPasada = (String) session.getAttribute("optPasada");
String extItinerario = (String) session.getAttribute("extItinerario");
if (!alumnoActual.getMatFamilia().equals("FP") && cursoCiclo.getCiclo().getFamilia().getId() != 2){
alumnoActual.setOptPasada(optPasada);
System.out.println("ACTUALIZANDO OPTATIVA PASADA" + optPasada);
if (!(boolean) session.getAttribute("esPDC") ){
if (cursoCiclo.getCurso().getNombre().equals("CUARTO")){
alumnoActual.setExtItinerario(moduloService.findByNombre(extItinerario, alumnoActual, cursoCiclo).getId());
model.addAttribute("extItinerarioNombre", moduloService.findById(alumnoActual.getExtItinerario()).getNombre());
}
System.out.println("ACTUALIZANDO EXTRA ITINERARIO" + extItinerario);
}
alumnoService.guardarAlumno(alumnoActual);
}
Matriculacion matriculacion = (Matriculacion) session.getAttribute("matriculacion");
matriculacion.setFecha(fechaHoraActual);
matriculacion.setAlumno(alumnoActual);
matriculacion.setCursoCiclo(cursoCiclo);
int matriculacionAux = matriculacionService.getMatriculacionByIdAlumno(alumnoActual.getId());
if (matriculacionAux != 0){
session.setAttribute("idMatricula", matriculacionAux);
return "redirect:/existeMatriculacion";
}
matriculacionService.guardarMatriculacion(matriculacion);
if (!alumnoActual.getMatFamilia().equals("FP")){
List<Optativas> optativasList = (List<Optativas>) session.getAttribute("optativasList");
for (Optativas optativa : optativasList){
optativasService.guardarOptativas(optativa);
}
matriculacion.setOptativas(optativasList);
}
model.addAttribute("matriculacion", matriculacion);
model.addAttribute("alumno", alumnoActual);
/*EmailBody emailBody = new EmailBody(getInfoHtmltoString(alumnoActual, matriculacion), "luis.cortes.a@ies1xabia.org",
"Encuesta: " + alumnoActual.getNia() + " " + alumnoActual.getNombre() + " " + alumnoActual.getApellido1(), "prematricula@ies.edu.es");
try {
sendEmail(emailBody);
} catch (Exception e){
System.out.println("NO SE HA PODIDO ENVIAR EL CORREO");
model.addAttribute("errorCorreo", true);
}*/
session.setAttribute("alumnoActual", null);
return "informacion";
}
private void sendEmail(EmailBody emailBody) {
emailPort.sendEmail(emailBody);
}
@GetMapping("/existeMatriculacion")
public String existeMatriculacion(HttpSession session, Model model){
Alumno alumnoActual = (Alumno) session.getAttribute("alumnoActual");
if (alumnoActual == null) {
return "redirect:/registro";
}
String cursoCiclo = null;
try {
model.addAttribute("alumno", alumnoActual);
int idMatricula = (int) session.getAttribute("idMatricula");
cursoCiclo = cursoCicloService.findByMatriculacionId(idMatricula);
model.addAttribute("cursoCicloString", cursoCiclo);
}catch (Exception e){
System.out.println("ERROR AL OBTENER LA MATRICULA" + e.getMessage());
}
return "existe_matricula";
}
@PostMapping("/borrarMatricula")
public String borrarMatricula(HttpSession session, RedirectAttributes redirectAttributes){
Alumno alumnoActual = (Alumno) session.getAttribute("alumnoActual");
if (alumnoActual == null) {
return "redirect:/registro";
}
int idMatriculacion = (int) session.getAttribute("idMatricula");
/* List<Optativas> optativasList = null;
try {
optativasList = optativasService.findOptativasByIdMatriculacion(idMatriculacion);
} catch (Exception e){
System.out.println("ERROR AL OBTENER LISTAS" + e.getMessage());
}
//Eliminar optativas
if (optativasList != null){
try {
optativasService.eliminarOptativas(optativasList);
} catch (Exception e){
System.out.println("ERROR AL ELIMINAR OPTATIVAS" + e.getMessage());
}
}*/
alumnoService.borrarAllAlumno(idMatriculacion);
//Eliminar campos alum no
alumnoActual.setAmpa(false);
alumnoActual.setEsRepetidor(false);
alumnoActual.setLimitacion(false);
alumnoActual.setPatologia(null);
alumnoActual.setMedicacion(null);
alumnoActual.setNombreApellidoPadre(null);
alumnoActual.setNombreApellidoMadre(null);
alumnoActual.setParentesco(null);
alumnoActual.setTxtFirma(null);
alumnoActual.setTxtLimitacion(null);
alumnoActual.setOptPasada(null);
alumnoActual.setExtItinerario(0);
alumnoService.guardarAlumno(alumnoActual);
redirectAttributes.addFlashAttribute("mensaje", "Matrícula borrada correctamente.");
return "redirect:/esRepetidor";
}
@GetMapping("/estadisticas")
public String estadisitcas(Model model){
List<EstadisticasVista> estadisticasVistas = estadisticasService.findAll();
model.addAttribute("estadisticasVista", estadisticasVistas);
return "estadisticas";
}
/* private String getInfoHtmltoString(Alumno alumno, Matriculacion matriculacion){
StringBuilder htmlContent = new StringBuilder();
htmlContent.append("<!DOCTYPE html>\n")
.append("<html lang=\"en\">\n")
.append("<head>\n")
.append(" <meta charset=\"UTF-8\">\n")
.append(" <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n")
.append(" <title>Resumen de Estadística</title>\n")
.append(" <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css\">\n")
.append("</head>\n")
.append("<body>\n")
.append("<nav class=\"navbar navbar-dark bg-primary\">\n")
.append(" <span class=\"navbar-brand mb-0 h1 text-center w-100\" style=\"font-size: 30px;\">\n")
.append(" </span>\n")
.append("</nav>\n")
.append("<nav class=\"navbar navbar-light\" style=\"background-color: #e3f2fd; padding-top: 0; padding-bottom: 0;\">\n")
.append(" <div class=\"container-fluid\">\n")
.append(" <span class=\"navbar-text mx-auto\" style=\"font-size: 20px;\">\n")
.append(" </span>\n")
.append(" </div>\n")
.append("</nav>\n")
.append("\n")
.append("<div class=\"container\">\n")
.append(" <div class=\"row\">\n")
.append(" <div class=\"col-md-6 mx-auto\">\n")
.append(" <div class=\"card mt-5\">\n")
.append(" <div class=\"card-header\">\n")
.append(" <h2 class=\"text-center\">Resumen de Estadística</h2>\n")
.append(" </div>\n")
.append(" <div class=\"card-body\">\n")
.append(" <h5>Información del Alumno:</h5>\n")
.append(" <p><b>Nombre: </b>").append(alumno.getNombre()).append("</p>\n")
.append(" <p><b>Apellidos: </b>").append(alumno.getApellido1())
.append(alumno.getApellido2() != null ? " " + alumno.getApellido2() : "").append("</p>\n")
.append(" <p><b>Correo 1: </b>").append(alumno.getCorreo1()).append("</p>\n")
.append(" <p><b>DNI: </b>").append(alumno.getDni()).append("</p>\n")
.append(" <p><b>Fecha de Nacimiento: </b>").append(new SimpleDateFormat("dd/MM/yyyy").format(alumno.getFechaNacimiento())).append("</p>\n");
if (alumno.isLimitacion()) {
htmlContent.append(" <p><b>Limitación: </b>").append(alumno.getTxtLimitacion()).append("</p>\n");
}
if (alumno.isAmpa()) {
htmlContent.append(" <p><b>AMPA:</b> Sí</p>\n");
}
if (alumno.getPatologia() != null) {
htmlContent.append(" <p><b>Patología: </b>").append(alumno.getPatologia().getNombre()).append("</p>\n");
}
if (alumno.getMedicacion() != null && !alumno.getMedicacion().isEmpty()) {
htmlContent.append(" <p><b>Medicación: </b>").append(alumno.getMedicacion()).append("</p>\n");
}
if (alumno.getTxtFirma() != null) {
htmlContent.append(" <p><b>Firma: </b>").append(alumno.getTxtFirma()).append("</p>\n");
}
if (alumno.getNombreApellidoPadre() != null) {
htmlContent.append(" <p><b>Nombre del Padre: </b>").append(alumno.getNombreApellidoPadre()).append("</p>\n");
}
if (alumno.getNombreApellidoMadre() != null) {
htmlContent.append(" <p><b>Nombre de la Madre: </b>").append(alumno.getNombreApellidoMadre()).append("</p>\n");
}
if (alumno.getParentesco() != null) {
htmlContent.append(" <p><b>Parentesco: </b>").append(alumno.getParentesco()).append("</p>\n");
}
htmlContent.append(" <h5>Información de la Matrícula:</h5>\n")
.append(" <p><b>Curso: </b>").append(matriculacion.getCursoCiclo().getCurso().getNumero()).append("</p>\n")
.append(" <p><b>Ciclo: </b>").append(matriculacion.getCursoCiclo().getCiclo().getNombre()).append("</p>\n");
if (matriculacion.getOptativas().size() > 0) {
htmlContent.append(" <p><b>Optativas:</b></p>\n")
.append(" <ul>\n");
for (int i = 0; i < matriculacion.getOptativas().size(); i++) {
Optativas optativa = matriculacion.getOptativas().get(i);
if (optativa.getOrden() > 0) {
htmlContent.append(" <li>").append(i + 1).append(". ").append(optativa.getModulo().getNombre()).append("</li>\n");
}
}
htmlContent.append(" </ul>\n");
}
boolean hasOptionMaterias = matriculacion.getOptativas().stream().anyMatch(optativa -> optativa.getOrden() == 0 && (optativa.getModulo().getBloque() == 1 || optativa.getModulo().getBloque() == 2 || optativa.getModulo().getBloque() == 3));
if (hasOptionMaterias) {
htmlContent.append(" <p><b>Materias de opción:</b></p>\n")
.append(" <ul>\n");
for (Optativas optativa : matriculacion.getOptativas()) {
if (optativa.getOrden() == 0 && (optativa.getModulo().getBloque() == 1 || optativa.getModulo().getBloque() == 2 || optativa.getModulo().getBloque() == 3)) {
htmlContent.append(" <li>").append(optativa.getModulo().getNombre()).append("</li>\n");
}
}
htmlContent.append(" </ul>\n");
if (alumno.getExtItinerario() != 0) {
htmlContent.append(" <p><b>Materia opción extra:</b></p>\n")
.append(" <ul>\n")
.append(" <li>").append(moduloService.findById(alumno.getExtItinerario()).getNombre()).append("</li>\n")
.append(" </ul>\n");
}
}
boolean hasReligion = matriculacion.getOptativas().stream().anyMatch(optativa -> optativa.getOrden() == 0 && optativa.getModulo().getBloque() == 4);
if (hasReligion) {
htmlContent.append(" <p><b>Religión/Atención Educativa:</b></p>\n")
.append(" <ul>\n");
for (Optativas optativa : matriculacion.getOptativas()) {
if (optativa.getOrden() == 0 && optativa.getModulo().getBloque() == 4) {
htmlContent.append(" <li>").append(optativa.getModulo().getNombre()).append("</li>\n");
}
}
htmlContent.append(" </ul>\n");
}
boolean hasMath = matriculacion.getOptativas().stream().anyMatch(optativa -> optativa.getOrden() == 0 && optativa.getModulo().getBloque() == 5);
if (hasMath) {
htmlContent.append(" <p><b>Matemáticas:</b></p>\n")
.append(" <ul>\n");
for (Optativas optativa : matriculacion.getOptativas()) {
if (optativa.getOrden() == 0 && optativa.getModulo().getBloque() == 5) {
htmlContent.append(" <li>").append(optativa.getModulo().getNombre()).append("</li>\n");
}
}
htmlContent.append(" </ul>\n");
}
htmlContent.append(" </div>\n")
.append(" </div>\n")
.append(" </div>\n")
.append(" </div>\n")
.append("</div>\n")
.append("<script src=\"https://kit.fontawesome.com/a076d05399.js\"></script>\n")
.append("</body>\n")
.append("</html>\n");
return htmlContent.toString();
}*/
}

@ -0,0 +1,67 @@
package com.proyecto.prematricula.email;
public class EmailBody {
private String content;
private String email;
private String subject;
private String cc;
public EmailBody(String content, String email, String subject) {
this.content = content;
this.email = email;
this.subject = subject;
}
public EmailBody(String content, String email, String subject, String cc) {
this.content = content;
this.email = email;
this.subject = subject;
this.cc = cc;
}
public String getContent() {
return content;
}
public String getEmail() {
return email;
}
public String getSubject() {
return subject;
}
public void setContent(String content) {
this.content = content;
}
public void setEmail(String email) {
this.email = email;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getCc() {
return cc;
}
public void setCc(String cc) {
this.cc = cc;
}
@Override
public String toString() {
return "EmailBody{" +
"content='" + content + '\'' +
", email='" + email + '\'' +
", subject='" + subject + '\'' +
", cc='" + cc + '\'' +
'}';
}
}

@ -0,0 +1,9 @@
package com.proyecto.prematricula.email;
import org.springframework.stereotype.Repository;
@Repository
public interface EmailPort {
boolean sendEmail(EmailBody emailBody);
}

@ -0,0 +1,45 @@
package com.proyecto.prematricula.email;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import org.springframework.stereotype.Service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
@Service
public class EmailService implements EmailPort {
private static final Logger LOGGER = LoggerFactory.getLogger(EmailService.class);
@Autowired
private JavaMailSender sender;
@Override
public boolean sendEmail(EmailBody emailBody) {
LOGGER.info("EmailBody: {}", emailBody.toString());
return sendEmailTool(emailBody.getContent(),emailBody.getEmail(), emailBody.getSubject(), emailBody.getCc());
}
private boolean sendEmailTool(String textMessage, String email,String subject, String cc) {
boolean send = false;
MimeMessage message = sender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message);
try {
helper.setTo(email);
helper.setText(textMessage, true);
helper.setSubject(subject);
sender.send(message);
helper.setCc(cc);
send = true;
LOGGER.info("Mail enviado!");
} catch (MessagingException e) {
LOGGER.error("Hubo un error al enviar el mail: {}", e);
}
return send;
}
}

@ -0,0 +1,26 @@
package com.proyecto.prematricula.enums;
public enum CursosEnum {
PRIMERO, SEGUNDO, TERCERO, CUARTO;
public static String getNombreByNumero(int num){
CursosEnum cursosEnum = null;
switch (num){
case 1:
cursosEnum = PRIMERO;
break;
case 2:
cursosEnum = SEGUNDO;
break;
case 3:
cursosEnum = TERCERO;
break;
case 4:
cursosEnum = CUARTO;
break;
}
return String.valueOf(cursosEnum);
}
}

@ -0,0 +1,101 @@
package com.proyecto.prematricula.modelos;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.bind.DefaultValue;
import java.util.*;
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Alumno {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(nullable = false)
private String nombre;
@Column(nullable = false)
private String apellido1;
private String apellido2;
@Column(nullable = false)
private String nia;
@Column(nullable = false)
private String dni;
@Column(nullable = false)
private String correo1;
@Column(nullable = false)
private String correo2;
@Column(nullable = false)
private String grupo;
@Column(nullable = false)
private String contrasenya;
@Column(name = "fecha_nacimiento", nullable = false)
private Date fechaNacimiento;
@Column(nullable = false)
private String matActual;
@Column(nullable = true)
private int matCurso;
@Column(length = 3)
private String matFamilia;
@Column(nullable = false, columnDefinition = "BOOLEAN DEFAULT false")
private boolean esRepetidor;
private String nombreApellidoPadre;
private String nombreApellidoMadre;
@Column(nullable = false, columnDefinition = "BOOLEAN DEFAULT false")
private boolean limitacion;
private String txtLimitacion;
@Column(nullable = false, columnDefinition = "BOOLEAN DEFAULT false")
private boolean religion;
@Column(nullable = false, columnDefinition = "BOOLEAN DEFAULT false")
private boolean ampa;
private String txtPatologia;
private String medicacion;
private String txtFirma;
private String parentesco;
private String optPasada;
@Column(name = "ext_itinerario", columnDefinition = "INT DEFAULT 0")
private int extItinerario;
@ManyToOne(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
@JoinColumn(name = "patologia_id")
@JsonBackReference
private Patologia patologia;
@OneToMany(mappedBy = "alumno", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JsonManagedReference("alumno-matriculacion")
private Set<Matriculacion> matriculacions = new HashSet<>();
}

@ -0,0 +1,48 @@
package com.proyecto.prematricula.modelos;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Entity
@NoArgsConstructor
@Table(name = "ciclo")
@AllArgsConstructor
@Data
public class Ciclo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(nullable = false)
private String nombre;
private String nombreVal;
private String codigo;
private String codigoDos;
@ManyToOne()
@JoinColumn(name = "familia_id")
@JsonBackReference
private Familia familia;
@OneToMany(mappedBy = "ciclo", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JsonManagedReference("ciclo-cursoCiclo")
private List<CursoCiclo> cursoCiclos = new ArrayList<>();
}

@ -0,0 +1,33 @@
package com.proyecto.prematricula.modelos;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.*;
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
@Table(name = "curso")
public class Curso {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(nullable = false)
private String numero;
private String nombre;
@OneToMany(mappedBy = "curso", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JsonManagedReference("curso-cursoCiclo")
private List<CursoCiclo> cursoCiclos = new ArrayList<>();
}

@ -0,0 +1,56 @@
package com.proyecto.prematricula.modelos;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.hibernate.annotations.Fetch;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@Entity
@NoArgsConstructor
@Table(name = "curso_ciclo")
@AllArgsConstructor
@Data
@ToString
public class CursoCiclo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@ManyToOne()
@JoinColumn(name = "curso_id")
@JsonBackReference
private Curso curso;
@ManyToOne()
@JoinColumn(name = "ciclo_id")
@JsonBackReference
private Ciclo ciclo;
@OneToMany(mappedBy = "cursoCiclo", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JsonManagedReference("cursoCiclo-matriculacion")
private List<Matriculacion> matriculacions = new ArrayList<>();
@OneToMany(mappedBy = "cursoCiclo", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JsonManagedReference("cursoCiclo-modulo")
private List<Modulo> modulo = new ArrayList<>();
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "promocion",
joinColumns = @JoinColumn(name = "curso_ciclo_id"),
inverseJoinColumns = @JoinColumn(name = "curso_ciclo_relacionado_id")
)
private Set<CursoCiclo> cursoCiclos;
}

@ -0,0 +1,30 @@
package com.proyecto.prematricula.modelos;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
@Table(name = "edu")
public class Edu {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(nullable = false)
private String nombre;
@OneToMany(mappedBy = "edu", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JsonManagedReference("edu-familia")
private List<Familia> familias = new ArrayList<>();
}

@ -0,0 +1,28 @@
package com.proyecto.prematricula.modelos;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
@Entity
public class EstadisticasVista {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private Long count;
private String nivel;
private Integer numero;
private String nombre;
}

@ -0,0 +1,39 @@
package com.proyecto.prematricula.modelos;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
@Table(name = "familia")
public class Familia {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(nullable = false)
private String nombre;
@Column(length = 3)
private String codigo;
@ManyToOne()
@JoinColumn(name = "edu_id")
@JsonBackReference
private Edu edu;
@OneToMany(mappedBy = "familia", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JsonManagedReference("familia-ciclo")
private List<Ciclo> ciclos = new ArrayList<>();
}

@ -0,0 +1,45 @@
package com.proyecto.prematricula.modelos;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.springframework.lang.NonNull;
import java.util.*;
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Matriculacion {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(nullable = false)
private Date fecha;
@ManyToOne()
@JoinColumn(name = "alumno_id")
@JsonBackReference
private Alumno alumno;
@ManyToOne()
@JoinColumn(name = "cursoCiclo_id")
@NonNull
@JsonBackReference
private CursoCiclo cursoCiclo;
@OneToMany(mappedBy = "matriculacion", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JsonBackReference("matriculacion-optativas")
private List<Optativas> optativas = new ArrayList<>();
}

@ -0,0 +1,43 @@
package com.proyecto.prematricula.modelos;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.HashSet;
import java.util.Set;
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
@Table(name = "modulo")
public class Modulo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(nullable = false)
private String nombre;
private String codigo;
private int bloque;
private boolean esItinerario = false;
@OneToMany(mappedBy = "modulo", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JsonManagedReference("modulo-optativas")
private Set<Optativas> optativas = new HashSet<>();
@ManyToOne()
@JoinColumn(name = "cursoCiclo_id")
@JsonBackReference
private CursoCiclo cursoCiclo;
}

@ -0,0 +1,39 @@
package com.proyecto.prematricula.modelos;
import com.fasterxml.jackson.annotation.JsonBackReference;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Optativas {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private int orden;
@ManyToOne()
@JsonBackReference
@JoinColumn(name = "matriculacion_id")
private Matriculacion matriculacion;
@ManyToOne()
@JsonBackReference
@JoinColumn(name = "modulo_id")
private Modulo modulo;
public Optativas(int orden, Matriculacion matriculacion, Modulo opcion) {
this.orden = orden;
this.matriculacion = matriculacion;
this.modulo = opcion;
}
}

@ -0,0 +1,30 @@
package com.proyecto.prematricula.modelos;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.proyecto.prematricula.servicios.Alumno.AlumnoService;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Set;
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Patologia {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(nullable = false)
private String nombre;
@OneToMany(mappedBy = "patologia", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JsonBackReference("patologia-alumno")
private Set<Alumno> alumnos;
}

@ -0,0 +1,25 @@
package com.proyecto.prematricula.repositorio;
import com.proyecto.prematricula.modelos.Alumno;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.jpa.repository.query.Procedure;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface AlumnoRepositorio extends JpaRepository<Alumno, Integer> {
@Query("SELECT a FROM Alumno a WHERE a.nia = ?1")
Alumno findByNia(String nia);
@Query("SELECT a FROM Alumno a WHERE a.id = ?1")
Alumno findById(int id);
@Procedure(name = "borrarmatricula")
void borrarmatricula(@Param("?1") int id);
}

@ -0,0 +1,35 @@
package com.proyecto.prematricula.repositorio;
import com.proyecto.prematricula.modelos.Ciclo;
import com.proyecto.prematricula.modelos.Familia;
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;
@Repository
public interface CicloRepositorio extends JpaRepository<Ciclo, Integer> {
@Query("SELECT c FROM Ciclo c WHERE c.familia.id = :familiaId")
List<Ciclo> findByFamiliaId(@Param("familiaId") int familiaId);
@Query("SELECT c FROM Ciclo c JOIN c.familia f JOIN f.edu e WHERE e.nombre = 'FP'")
List<Ciclo> findAllCiclosByEduFP();
@Query("SELECT c FROM Ciclo c WHERE c.familia.id = 2")
List<Ciclo> getCiclosBach();
@Query("SELECT c FROM Ciclo c WHERE c.codigo = ?1")
Ciclo findByCodigo(String codigo);
@Query("SELECT c FROM Ciclo c WHERE c.nombre = ?1")
Ciclo findByNombre(String nombre);
@Query("SELECT c FROM Ciclo c WHERE c.codigoDos = ?1")
List<Ciclo> findCicloByCodigoDos(String codigoDos);
}

@ -0,0 +1,25 @@
package com.proyecto.prematricula.repositorio;
import com.proyecto.prematricula.modelos.Ciclo;
import com.proyecto.prematricula.modelos.Curso;
import com.proyecto.prematricula.modelos.CursoCiclo;
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;
@Repository
public interface CursoCicloRepositorio extends JpaRepository<CursoCiclo, Integer> {
@Query("SELECT c FROM Curso c INNER JOIN CursoCiclo cc ON c.id = cc.curso.id INNER JOIN Ciclo ci ON cc.ciclo.id = ci.id WHERE ci.id = :cicloId")
List<Curso> findCursosByCicloId(@Param("cicloId") int cicloId);
@Query("SELECT cc FROM CursoCiclo cc WHERE cc.curso.id = :cursoId AND cc.ciclo.id = :cicloId")
CursoCiclo findByCursoIdAndCicloId(@Param("cursoId") int cursoId, @Param("cicloId") int cicloId);
@Query("SELECT dimecursociclo(:matriculaId)")
String findCursoCicloByIdMatricula(@Param("matriculaId") int matriculaId);
}

@ -0,0 +1,17 @@
package com.proyecto.prematricula.repositorio;
import com.proyecto.prematricula.modelos.Curso;
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;
@Repository
public interface CursoRepositorio extends JpaRepository<Curso, Integer> {
@Query("SELECT c FROM Curso c WHERE c.nombre = ?1")
Curso findByNombre(String nombre);
}

@ -0,0 +1,15 @@
package com.proyecto.prematricula.repositorio;
import com.proyecto.prematricula.modelos.Alumno;
import com.proyecto.prematricula.modelos.Edu;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
@Repository
public interface EduRepositorio extends JpaRepository<Edu, Integer> {
@Query("SELECT e FROM Edu e WHERE e.nombre = ?1")
Edu findByNombre(String nombre);
}

@ -0,0 +1,10 @@
package com.proyecto.prematricula.repositorio;
import com.proyecto.prematricula.modelos.EstadisticasVista;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface EstadisticasRepositorio extends JpaRepository<EstadisticasVista, Integer > {
}

@ -0,0 +1,21 @@
package com.proyecto.prematricula.repositorio;
import com.proyecto.prematricula.modelos.Edu;
import com.proyecto.prematricula.modelos.Familia;
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;
@Repository
public interface FamiliaRepositorio extends JpaRepository<Familia, Integer> {
@Query("SELECT f FROM Familia f WHERE f.edu.id = :eduId")
List<Familia> findByEduId(@Param("eduId") int eduId);
@Query("SELECT f FROM Familia f WHERE f.nombre = ?1")
Familia findByNombre(String nombre);
}

@ -0,0 +1,22 @@
package com.proyecto.prematricula.repositorio;
import com.proyecto.prematricula.modelos.Matriculacion;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
@Repository
public interface MatriculacionRepositorio extends JpaRepository<Matriculacion, Integer> {
@Query("SELECT existematricula(?1)")
int getIdMatriculaByIdAlumno(int alumnoId);
@Query("SELECT m FROM Matriculacion m WHERE m.id = ?1")
Matriculacion getMatriculaById(int id);
@Modifying
@Query("DELETE FROM Matriculacion WHERE id = ?1")
void borrarMatriculacionById(int id);
}

@ -0,0 +1,44 @@
package com.proyecto.prematricula.repositorio;
import com.proyecto.prematricula.modelos.Modulo;
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;
@Repository
public interface ModuloRepositorio extends JpaRepository<Modulo, Integer> {
@Query("SELECT m FROM Modulo m WHERE m.cursoCiclo.id = :cursoCicloId AND m.bloque = :bloque AND m.nombre NOT LIKE '%PDC%'")
List<Modulo> findByIdCursoCicloAndBloque(@Param("cursoCicloId") int idCursoCiclo, @Param("bloque") int bloque);
@Query("SELECT m FROM Modulo m WHERE m.bloque = :bloque AND m.nombre NOT LIKE '%PDC%' ")
List<Modulo> findModuloByBloque(@Param("bloque") int bloque);
@Query("SELECT m FROM Modulo m WHERE m.bloque > 0")
List<Modulo> findModulosWithBloque();
@Query("SELECT m FROM Modulo m WHERE (m.bloque = :bloque1 OR m.bloque = :bloque2 OR m.bloque = :bloque3) AND m.nombre NOT LIKE '%PDC%'")
List<Modulo> findBloqueExtItinerario(@Param("bloque1") int bloque1, @Param("bloque2") int bloque2, @Param("bloque3") int bloque3);
@Query("SELECT m FROM Modulo m WHERE m.nombre = :nombreModulo")
List<Modulo> findByNombre(@Param("nombreModulo") String nombreModulo);
@Query("SELECT m FROM Modulo m WHERE m.id = :idModulo")
Modulo findById(@Param("idModulo") int idModulo);
@Query("SELECT m FROM Modulo m where m.nombre = 'PDC4'")
List<Modulo> findListPDC4();
}

@ -0,0 +1,17 @@
package com.proyecto.prematricula.repositorio;
import com.proyecto.prematricula.modelos.Optativas;
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;
@Repository
public interface OptativaRepositorio extends JpaRepository<Optativas, Integer> {
@Query("SELECT o FROM Optativas o WHERE o.matriculacion.id = :matriculacionId")
List<Optativas> findOptativasByIdMatriculacion(@Param("matriculacionId") int matriculacionId);
}

@ -0,0 +1,14 @@
package com.proyecto.prematricula.repositorio;
import com.proyecto.prematricula.modelos.Patologia;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
@Repository
public interface PatologiaRepositorio extends JpaRepository<Patologia, Integer> {
@Query("SELECT p FROM Patologia p WHERE p.nombre = ?1")
Patologia getPatologiaPorNombre(String nombre);
}

@ -0,0 +1,15 @@
package com.proyecto.prematricula.servicios.Alumno;
import com.proyecto.prematricula.modelos.Alumno;
import java.util.Optional;
public interface AlumnoService {
Alumno getAlumnoByNia(String nia);
Alumno getAlumnoById(int id);
void guardarAlumno(Alumno alumno);
void borrarAllAlumno(int idMatricula);
}

@ -0,0 +1,44 @@
package com.proyecto.prematricula.servicios.Alumno;
import com.proyecto.prematricula.modelos.Alumno;
import com.proyecto.prematricula.repositorio.AlumnoRepositorio;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Optional;
@Service
@Transactional
public class AlumnoServiceImp implements AlumnoService {
@Autowired
AlumnoRepositorio alumnoRepositorio;
@Override
public Alumno getAlumnoByNia(String nia) {
try {
return alumnoRepositorio.findByNia(nia);
} catch (Exception e){
return null;
}
}
@Override
public Alumno getAlumnoById(int id) {
return alumnoRepositorio.findById(id);
}
@Override
public void guardarAlumno(Alumno alumno) {
alumnoRepositorio.save(alumno);
}
@Override
public void borrarAllAlumno(int idMatricula) {
alumnoRepositorio.borrarmatricula(idMatricula);
}
}

@ -0,0 +1,23 @@
package com.proyecto.prematricula.servicios.Ciclo;
import com.proyecto.prematricula.modelos.Ciclo;
import com.proyecto.prematricula.modelos.Edu;
import com.proyecto.prematricula.modelos.Familia;
import java.util.List;
public interface CicloService {
List<Ciclo> getCiclosByIdFamilia(int idFamilia);
List<Ciclo> getCiclosBach();
List<Ciclo> findAllCiclosByEduFP();
List<Ciclo> findCicloByCodigoDos(String codigoDos);
Ciclo getCicloByCodigo(String codigo);
Ciclo getCicloByNombre(String nombre);
void save(Ciclo ciclo);
}

@ -0,0 +1,55 @@
package com.proyecto.prematricula.servicios.Ciclo;
import com.proyecto.prematricula.modelos.Ciclo;
import com.proyecto.prematricula.repositorio.CicloRepositorio;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class CicloServiceImp implements CicloService{
@Autowired
private CicloRepositorio cicloRepositorio;
@Override
public List<Ciclo> getCiclosByIdFamilia(int idFamilia) {
return cicloRepositorio.findByFamiliaId(idFamilia);
}
@Override
public List<Ciclo> getCiclosBach() {
List<Ciclo> ciclosBach = cicloRepositorio.getCiclosBach();
ciclosBach.removeIf(ciclo -> ciclo.getCodigo().isEmpty());
return ciclosBach;
}
@Override
public List<Ciclo> findAllCiclosByEduFP() {
return cicloRepositorio.findAllCiclosByEduFP();
}
@Override
public List<Ciclo> findCicloByCodigoDos(String codigoDos) {
return cicloRepositorio.findCicloByCodigoDos(codigoDos);
}
@Override
public Ciclo getCicloByCodigo(String codigo) {
return cicloRepositorio.findByCodigo(codigo);
}
@Override
public Ciclo getCicloByNombre(String nombre) {
return cicloRepositorio.findByNombre(nombre);
}
@Override
public void save(Ciclo ciclo) {
cicloRepositorio.save(ciclo);
}
}

@ -0,0 +1,12 @@
package com.proyecto.prematricula.servicios.Curso;
import com.proyecto.prematricula.modelos.Ciclo;
import com.proyecto.prematricula.modelos.Curso;
import java.util.List;
public interface CursoService {
Curso getCursoByNombre(String nombre);
}

@ -0,0 +1,23 @@
package com.proyecto.prematricula.servicios.Curso;
import com.proyecto.prematricula.modelos.Ciclo;
import com.proyecto.prematricula.modelos.Curso;
import com.proyecto.prematricula.repositorio.CursoRepositorio;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class CursoServiceImp implements CursoService {
@Autowired
private CursoRepositorio cursoRepositorio;
@Override
public Curso getCursoByNombre(String nombre) {
return cursoRepositorio.findByNombre(nombre);
}
}

@ -0,0 +1,15 @@
package com.proyecto.prematricula.servicios.CursoCiclo;
import com.proyecto.prematricula.modelos.Curso;
import com.proyecto.prematricula.modelos.CursoCiclo;
import java.util.List;
public interface CursoCicloService {
List<Curso> getCursoByIdCiclo(int idCiclo);
CursoCiclo findByCursoIdAndCicloId(int idCurso, int idCiclo);
String findByMatriculacionId(int matriculaId);
}

@ -0,0 +1,32 @@
package com.proyecto.prematricula.servicios.CursoCiclo;
import com.proyecto.prematricula.modelos.Curso;
import com.proyecto.prematricula.modelos.CursoCiclo;
import com.proyecto.prematricula.repositorio.CursoCicloRepositorio;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class CursoCicloServiceImp implements CursoCicloService {
@Autowired
private CursoCicloRepositorio cursoCicloRepositorio;
@Override
public List<Curso> getCursoByIdCiclo(int idCiclo) {
return cursoCicloRepositorio.findCursosByCicloId(idCiclo);
}
@Override
public CursoCiclo findByCursoIdAndCicloId(int idCurso, int idCiclo) {
return cursoCicloRepositorio.findByCursoIdAndCicloId(idCurso, idCiclo);
}
@Override
public String findByMatriculacionId(int matriculaId) {
return cursoCicloRepositorio.findCursoCicloByIdMatricula(matriculaId);
}
}

@ -0,0 +1,11 @@
package com.proyecto.prematricula.servicios.Edu;
import com.proyecto.prematricula.modelos.Edu;
import java.util.List;
public interface EduService {
Edu getEduByNombre(String nombre);
List<Edu> getAllEdu();
}

@ -0,0 +1,25 @@
package com.proyecto.prematricula.servicios.Edu;
import com.proyecto.prematricula.modelos.Edu;
import com.proyecto.prematricula.repositorio.EduRepositorio;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class EduServiceImp implements EduService {
@Autowired
private EduRepositorio eduRepositorio;
@Override
public Edu getEduByNombre(String nombre) {
return eduRepositorio.findByNombre(nombre);
}
public List<Edu> getAllEdu() {
return eduRepositorio.findAll();
}
}

@ -0,0 +1,10 @@
package com.proyecto.prematricula.servicios.Estadisticas;
import com.proyecto.prematricula.modelos.EstadisticasVista;
import java.util.List;
public interface EstadisticasService {
List<EstadisticasVista> findAll();
}

@ -0,0 +1,22 @@
package com.proyecto.prematricula.servicios.Estadisticas;
import com.proyecto.prematricula.modelos.EstadisticasVista;
import com.proyecto.prematricula.repositorio.EstadisticasRepositorio;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class EstadisticasServiceImp implements EstadisticasService{
@Autowired
private EstadisticasRepositorio estadisticasRepositorio;
@Override
public List<EstadisticasVista> findAll() {
return estadisticasRepositorio.findAll();
}
}

@ -0,0 +1,12 @@
package com.proyecto.prematricula.servicios.Familia;
import com.proyecto.prematricula.modelos.Edu;
import com.proyecto.prematricula.modelos.Familia;
import java.util.List;
public interface FamiliaService {
List<Familia> getFamiliasByIdEdu(int idEdu);
Familia getFamiliaByNombre(String nombre);
}

@ -0,0 +1,27 @@
package com.proyecto.prematricula.servicios.Familia;
import com.proyecto.prematricula.modelos.Edu;
import com.proyecto.prematricula.modelos.Familia;
import com.proyecto.prematricula.repositorio.FamiliaRepositorio;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class FamiliaServiceImp implements FamiliaService{
@Autowired
private FamiliaRepositorio familiaRepositorio;
@Override
public List<Familia> getFamiliasByIdEdu(int idEdu) {
return familiaRepositorio.findByEduId(idEdu);
}
@Override
public Familia getFamiliaByNombre(String nombre) {
return familiaRepositorio.findByNombre(nombre);
}
}

@ -0,0 +1,17 @@
package com.proyecto.prematricula.servicios.Matriculacion;
import com.proyecto.prematricula.modelos.Matriculacion;
public interface MatriculacionService {
void guardarMatriculacion(Matriculacion matriculacion);
void eliminarMatriculacion(Matriculacion matriculacion);
int getMatriculacionByIdAlumno(int idAlumno);
Matriculacion getMatriculaById(int id);
void borrarMatriculaById(int id);
}

@ -0,0 +1,43 @@
package com.proyecto.prematricula.servicios.Matriculacion;
import com.proyecto.prematricula.modelos.Matriculacion;
import com.proyecto.prematricula.repositorio.MatriculacionRepositorio;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class MatriculacionServiceImp implements MatriculacionService {
@Autowired
MatriculacionRepositorio matriculacionRepositorio;
@Override
public void guardarMatriculacion(Matriculacion matriculacion) {
matriculacionRepositorio.save(matriculacion);
}
@Override
public void eliminarMatriculacion(Matriculacion matriculacion) {
matriculacionRepositorio.delete(matriculacion);
}
@Override
public int getMatriculacionByIdAlumno(int idAlumno) {
return matriculacionRepositorio.getIdMatriculaByIdAlumno(idAlumno);
}
@Override
public Matriculacion getMatriculaById(int id) {
return matriculacionRepositorio.getMatriculaById(id);
}
@Override
public void borrarMatriculaById(int id) {
matriculacionRepositorio.borrarMatriculacionById(id);
}
}

@ -0,0 +1,24 @@
package com.proyecto.prematricula.servicios.Modulo;
import com.proyecto.prematricula.modelos.Alumno;
import com.proyecto.prematricula.modelos.CursoCiclo;
import com.proyecto.prematricula.modelos.Modulo;
import java.util.List;
import java.util.Optional;
public interface ModuloService {
List<Modulo> findByIdCursoCicloAndBloque(int idCursoCiclo, int bloque);
Modulo findByNombre(String nombre, Alumno alumno, CursoCiclo cursoCiclo);
Modulo findById(int id);
List<Modulo> findModuloByBloque(int bloque);
List<Modulo> findBloqueExtItinerario(int bloque1, int bloque2, int bloque3);
List<Modulo> findListPDC4();
List<Modulo> findModulosWithBloque();
}

@ -0,0 +1,75 @@
package com.proyecto.prematricula.servicios.Modulo;
import com.proyecto.prematricula.modelos.Alumno;
import com.proyecto.prematricula.modelos.CursoCiclo;
import com.proyecto.prematricula.modelos.Modulo;
import com.proyecto.prematricula.repositorio.CursoCicloRepositorio;
import com.proyecto.prematricula.repositorio.ModuloRepositorio;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
public class ModuloServiceImp implements ModuloService {
@Autowired
private ModuloRepositorio moduloRepositorio;
@Override
public List<Modulo> findByIdCursoCicloAndBloque(int idCursoCiclo, int bloque) {
return moduloRepositorio.findByIdCursoCicloAndBloque(idCursoCiclo, bloque);
}
@Override
public Modulo findByNombre(String nombre, Alumno alumno, CursoCiclo cursoCiclo) {
System.out.println("EL NOMBRE DEL MODULO ES: " + nombre);
List<Modulo> modulos = moduloRepositorio.findByNombre(nombre);
if (modulos.size() > 1){
for (Modulo modulo : modulos){
if (modulo.getCursoCiclo().getId() == cursoCiclo.getId()){
System.out.println("DEVOLVIENDO EL MODULO DEL CURSO DEL ALUMNO" + modulo.getNombre());
return modulo;
}
}
}
try {
System.out.println("DEVOLVIENDO UNICO MODULO");
return modulos.get(0);
} catch (Exception e){
System.out.println("ERROR PORQUE: " + e.getMessage());
}
return null;
}
@Override
public Modulo findById(int id) {
return moduloRepositorio.findById(id);
}
@Override
public List<Modulo> findModuloByBloque(int bloque) {
return moduloRepositorio.findModuloByBloque(bloque);
}
@Override
public List<Modulo> findBloqueExtItinerario(int bloque1, int bloque2, int bloque3) {
return moduloRepositorio.findBloqueExtItinerario(bloque1, bloque2, bloque3);
}
@Override
public List<Modulo> findListPDC4() {
return moduloRepositorio.findListPDC4();
}
@Override
public List<Modulo> findModulosWithBloque() {
return moduloRepositorio.findModulosWithBloque();
}
}

@ -0,0 +1,16 @@
package com.proyecto.prematricula.servicios.Optativas;
import com.proyecto.prematricula.modelos.Optativas;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface OptativasService {
void guardarOptativas(Optativas optativas);
void eliminarOptativas(List<Optativas> optativas);
List<Optativas> findOptativasByIdMatriculacion(int matriculacionId);
}

@ -0,0 +1,36 @@
package com.proyecto.prematricula.servicios.Optativas;
import com.proyecto.prematricula.modelos.Alumno;
import com.proyecto.prematricula.modelos.Optativas;
import com.proyecto.prematricula.repositorio.OptativaRepositorio;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@Transactional
public class OptativasServiceImp implements OptativasService{
@Autowired
private OptativaRepositorio optativaRepositorio;
@Override
public void guardarOptativas(Optativas optativas) {
optativaRepositorio.save(optativas);
}
@Override
public void eliminarOptativas(List<Optativas> optativasList) {
for (Optativas optativas : optativasList){
optativaRepositorio.delete(optativas);
}
}
@Override
public List<Optativas> findOptativasByIdMatriculacion(int matriculacionId) {
return optativaRepositorio.findOptativasByIdMatriculacion(matriculacionId);
}
}

@ -0,0 +1,12 @@
package com.proyecto.prematricula.servicios.Patologia;
import com.proyecto.prematricula.modelos.Patologia;
import java.util.List;
public interface PatologiaService {
List<Patologia> getAllPatologias();
Patologia getPatologiaByNombre(String nombre);
}

@ -0,0 +1,32 @@
package com.proyecto.prematricula.servicios.Patologia;
import com.proyecto.prematricula.modelos.Patologia;
import com.proyecto.prematricula.repositorio.PatologiaRepositorio;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@Transactional
public class PatologiaServiceImp implements PatologiaService {
@Autowired
private PatologiaRepositorio patologiaRepositorio;
@Override
public List<Patologia> getAllPatologias(){
return patologiaRepositorio.findAll();
}
@Override
public Patologia getPatologiaByNombre(String nombre) {
return patologiaRepositorio.getPatologiaPorNombre(nombre);
}
}

@ -0,0 +1,31 @@
server.port=8090
spring.datasource.url=jdbc:mysql://localhost/prematricula
spring.datasource.username=root
#spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#Configuraciones de JPA
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
#Dialecto
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
#Insertados datos de pureba
#spring.jpa.defer-datasource-initialization=true
#spring.sql.init.mode=always
#Configuración email
spring.mail.host=mail.ies.edu.es
spring.mail.port=587
spring.mail.protocol=smtp
spring.mail.username=prematricula@ies.edu.es
spring.mail.password=1234
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=false
spring.mail.properties.mail.smtp.starttls.required=false
spring.mail.properties.mail.smtp.quitwait=false
es.matricula = true

File diff suppressed because it is too large Load Diff

@ -0,0 +1,15 @@
.central-box {
background-color: rgba(255, 255, 255, 0.8);
padding: 20px;
border-radius: 10px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
margin: auto;
width: 40%;
max-width: 600px;
height: auto;
}
.title {
text-align: center;
}

@ -0,0 +1,105 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>NIA Encontrado</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<style>
.custom-box {
background-color: #f0f0f0;
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.3);
padding: 20px;
margin-bottom: 20px;
border-radius: 10px;
text-align: center;
transition: box-shadow 0.3s ease;
}
.container-custom {
margin-top: 50px;
}
.custom-box a {
display: block;
text-decoration: none;
color: inherit;
}
.custom-box p {
font-weight: bold;
font-size: 30px;
}
.custom-box.clicked {
box-shadow: 0px 0px 20px rgba(0, 255, 0, 1);
}
</style>
</head>
<body>
<nav class="navbar navbar-dark bg-primary">
<span class="navbar-brand mb-0 h1">
Bienvenida/o, <span th:text="${alumno.nombre + ' ' + alumno.apellido1}"></span> (NIA: <span th:text="${alumno.nia}"></span>).
</span>
<a href="/registro" class="btn btn-danger btn-sm">
<i class="fas fa-sign-out-alt"></i> Salir
</a>
</nav>
<nav class="navbar navbar-light" style="background-color: #e3f2fd; padding-top: 0; padding-bottom: 0;">
<div class="container-fluid">
<span class="navbar-text mx-auto" style="font-size: 30px;">
<span th:text="${informacion}"></span>
</span>
</div>
</nav>
<div class="container-custom">
<div class="container my-4">
<div class="row">
<div class="col-md-6" th:each="opcion : ${ciclos}">
<a th:href="@{/completado(opcion=${opcion.nombre})}" class="clickable-box">
<div class="custom-box">
<p th:text="${opcion.nombre}"></p>
</div>
</a>
</div>
</div>
</div>
</div>
<div class="container my-4">
<div class="row justify-content-right">
<div class="col-auto ml-auto">
<a class="btn btn-primary btn-lg" onclick="redirectToCompletado()">Siguiente &rarr;</a>
</div>
</div>
</div>
<script>
let cicloSeleccionado = null; // Variable global para almacenar la opción seleccionada
const clickableBoxes = document.querySelectorAll('.clickable-box');
clickableBoxes.forEach(box => {
box.addEventListener('click', function(event) {
// Evitar que el evento de clic en las opciones provoque la redirección
event.preventDefault();
document.querySelectorAll('.custom-box').forEach(box => {
box.classList.remove('clicked');
});
const customBox = this.querySelector('.custom-box');
customBox.classList.add('clicked');
// Guardar la opción seleccionada en la variable global
cicloSeleccionado = customBox.querySelector('p').textContent;
});
});
function redirectToCompletado() {
if (cicloSeleccionado) {
window.location.href = '/completado?cic=' + cicloSeleccionado;
} else {
alert('Por favor, selecciona una opción antes de continuar.');
}
}
</script>
</body>
</html>

@ -0,0 +1,114 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>NIA Encontrado</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<style>
.custom-box {
background-color: #f0f0f0;
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.3);
padding: 20px;
margin-bottom: 20px;
border-radius: 10px;
text-align: center;
transition: box-shadow 0.3s ease;
}
.container-custom {
margin-top: 50px;
}
.custom-box a {
display: block;
text-decoration: none;
color: inherit;
}
.custom-box p {
font-weight: bold;
font-size: 30px;
}
.custom-box.clicked {
box-shadow: 0px 0px 20px rgba(0, 255, 0, 1);
}
</style>
</head>
<body>
<nav class="navbar navbar-dark bg-primary">
<span class="navbar-brand mb-0 h1">
Bienvenida/o, <span th:text="${alumno.nombre + ' ' + alumno.apellido1}"></span> (NIA: <span th:text="${alumno.nia}"></span>)
Tu matricula actual es: <span th:text="${alumno.matActual}"></span>
</span>
<a href="/registro" class="btn btn-danger btn-sm">
<i class="fas fa-sign-out-alt"></i> Salir
</a>
</nav>
<nav class="navbar navbar-light" style="background-color: #e3f2fd; padding-top: 0; padding-bottom: 0;">
<div class="container-fluid">
<span class="navbar-text mx-auto" style="font-size: 30px;">
EDU &rarr; Familia &rarr; Ciclo &rarr; <b>Curso</b>
</span>
</div>
</nav>
<div th:if="${cicloSeleccionado}">
<p>Has seleccionado: <span th:text="${cicloSeleccionado}"></span></p>
</div>
<div class="container-custom">
<div class="container my-4">
<div class="row">
<div class="col-md-6" th:each="opcion : ${cursos}">
<a th:href="@{/completado(opcion=${opcion.numero})}" class="clickable-box">
<div class="custom-box">
<p th:text="${opcion.numero}"></p>
</div>
</a>
</div>
</div>
</div>
</div>
<div class="container my-4">
<div class="row justify-content-between">
<div class="col-auto">
<a href="/ciclo" class="btn btn-primary btn-lg">&larr; Atrás</a>
</div>
<div class="col-auto">
<a class="btn btn-primary btn-lg" onclick="redirectToCompletado()">Finalizar &rarr;</a>
</div>
</div>
</div>
<script>
let cursoSeleccionado = null; // Variable global para almacenar la opción seleccionada
const clickableBoxes = document.querySelectorAll('.clickable-box');
clickableBoxes.forEach(box => {
box.addEventListener('click', function(event) {
// Evitar que el evento de clic en las opciones provoque la redirección
event.preventDefault();
document.querySelectorAll('.custom-box').forEach(box => {
box.classList.remove('clicked');
});
const customBox = this.querySelector('.custom-box');
customBox.classList.add('clicked');
// Guardar la opción seleccionada en la variable global
cursoSeleccionado = customBox.querySelector('p').textContent;
});
});
// Función para redirigir a la página de curso solo si hay una opción seleccionada
function redirectToCompletado() {
if (cursoSeleccionado) {
window.location.href = '/completado?cur=' + cursoSeleccionado;
} else {
alert('Por favor, selecciona una opción antes de continuar.');
}
}
</script>
</body>
</html>

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>ERROR</h1>
</body>
</html>

@ -0,0 +1,156 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>Pregunta de Repetición</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<style>
.custom-box {
background-color: #e3f2fd;
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.3);
padding: 10px 200px;
border-radius: 10px;
text-align: center;
margin: 10px 0px 10px 0px;
transition: box-shadow 0.3s ease;
}
.container-custom {
margin-top: 50px;
}
.custom-box a {
display: block;
text-decoration: none;
color: inherit;
}
.custom-box p {
font-weight: bold;
font-size: 30px;
margin-top: 10px;
}
.custom-box.clicked {
box-shadow: 0px 0px 20px rgba(0, 255, 0, 1);
}
.button-box {
text-align: center;
}
.button-box button {
border: none;
padding: 5px 15px;
border-radius: 10px;
cursor: pointer;
background-color: #007bff;
color: #959595;
font-size: 18px;
transition: background-color 0.3s ease;
}
.button-box button:hover {
background-color: #0056b3;
}
.list-group-item:hover,
.list-group-item:focus {
background-color: #f8f9fa;
}
.list-group-item:has(input:checked) {
background-color: #e3f2fd;
}
.list-group-item {
padding: 0.5rem 1rem;
}
.list-group-item input[type="radio"] {
margin-left: 5px;
}
.list-group-item label {
margin-left: 30px;
}
</style>
</head>
<body>
<nav class="navbar navbar-dark bg-primary">
<span class="navbar-brand mb-0 h1">
Bienvenida/o, <span th:text="${alumno.nombre + ' ' + alumno.apellido1}"></span> (NIA: <span th:text="${alumno.nia}"></span>)
</span>
<span class="navbar-brand mb-01 h1" style="margin-right: 300px;">Tu matricula actual es: <span th:text="${alumno.matActual}"></span></span>
<a href="/registro" class="btn btn-danger btn-sm">
<i class="fas fa-sign-out-alt"></i> Salir
</a>
</nav>
<div th:if="${mensaje}" class="alert alert-success" role="alert">
<p th:text="${mensaje}"></p>
</div>
<form action="/redireccionRepetidor" method="post" onsubmit="return validarFormulario()">
<div th:if="${esTercero} or ${esCuarto}">
<nav class="navbar navbar-light" style="background-color: #e3f2fd; padding-top: 0; padding-bottom: 0;">
<div class="container-fluid">
<span class="navbar-text mx-auto" style="font-size: 30px;">
¿Eres un alumno de PDC?
</span>
</div>
</nav>
<div class="container align-items-center" style="margin-left: 65vh; margin-top: 30px; margin-bottom: 30px;">
<div class="row">
<div class="col-md-6">
<ul class="list-group">
<li class="list-group-item">
<input class="form-check-input me-1" type="radio" value="si" id="si2" name="opcion1">
<label class="form-check-label stretched-link" for="si2">Si</label>
</li>
<li class="list-group-item">
<input class="form-check-input me-1" type="radio" value="no" id="no2" name="opcion1">
<label class="form-check-label stretched-link" for="no2">No</label>
</li>
</ul>
</div>
</div>
</div>
</div>
<div>
<nav class="navbar navbar-light" style="background-color: #e3f2fd; padding-top: 0; padding-bottom: 0;">
<div class="container-fluid">
<span class="navbar-text mx-auto" style="font-size: 30px;">
¿Vas a repetir tu curso actual?
</span>
</div>
</nav>
<div class="container-custom">
<div class="container my-4">
<div class="row">
<div class="col-md-6 button-box">
<button type="submit" class="clickable-box" name="esRepetidor" value="true">
<div class="custom-box">
<p>SI</p>
</div>
</button>
</div>
<div class="col-md-6 button-box">
<button type="submit" class="clickable-box" name="esRepetidor" value="false">
<div class="custom-box">
<p>NO</p>
</div>
</button>
</div>
</div>
</div>
</div>
</div>
</form>
<script>
function validarFormulario() {
const si2 = document.getElementById('si2');
const no2 = document.getElementById('no2');
if (!si2.checked && !no2.checked) {
alert('Por favor, completa el campo de si eres un alumno de PDC.');
return false;
}
return true;
}
</script>
</body>
</html>

@ -0,0 +1,30 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Estadísticas</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<h1>Estadísticas</h1>
<table class="table table-striped">
<thead>
<tr>
<th>Count</th>
<th>Nivel</th>
<th>Número</th>
<th>Nombre</th>
</tr>
</thead>
<tbody>
<tr th:each="estadistica : ${estadisticasVista}">
<td th:text="${estadistica.count}"></td>
<td th:text="${estadistica.nivel}"></td>
<td th:text="${estadistica.numero}"></td>
<td th:text="${estadistica.nombre}"></td>
</tr>
</tbody>
</table>
</div>
</body>
</html>

@ -0,0 +1,57 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>NIA Encontrado</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
</head>
<body>
<nav class="navbar navbar-dark bg-primary">
<span class="navbar-brand mb-0 h1">
Bienvenida/o, <span th:text="${alumno.nombre + ' ' + alumno.apellido1}"></span> (NIA: <span th:text="${alumno.nia}"></span>)
</span>
<a href="/registro" class="btn btn-danger btn-sm">
<i class="fas fa-sign-out-alt"></i> Salir
</a>
</nav>
<nav class="navbar navbar-light" style="background-color: #e3f2fd; padding-top: 0; padding-bottom: 0;">
<div class="container-fluid">
<span class="navbar-text mx-auto" style="font-size: 30px;">
<b>¡ATENCIÓN!</b>
</span>
</div>
</nav>
<div class="container text-center mt-4">
<h3 style="color: #757575">Parece que ya existe una matricula registrada con este NIA </h3>
<h4 style="color: #959595">¿Está seguro que desea eliminarla y comenzar una nueva? </h4>
</div>
<nav class="navbar navbar-light" style="background-color: #e3f2fd; padding-top: 0; padding-bottom: 0; margin-top: 50px">
<div class="container-fluid">
<span class="navbar-text mx-auto" style="font-size: 20px;">
Curso y Ciclo: <span th:text="${cursoCicloString}"></span><br>
</span>
</div>
</nav>
<div class="container-fluid" style="padding: 10px; margin-top: 50px;">
<div class="row justify-content-center">
<div class="col-6 text-center">
<form action="/registro" method="get">
<button type="submit" class="btn btn-primary btn-lg">
QUIERO MANTENER MI MATRICULA
</button>
</form>
</div>
<div class="col-6 text-center">
<form action="/borrarMatricula" method="post">
<button type="submit" class="btn btn-danger btn-lg">
QUIERO ELIMINAR MI MATRICULA
</button>
</form>
</div>
</div>
</div>
</body>
</html>

@ -0,0 +1,326 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>EXTRA</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<style>
/* Estilos para el select */
.form-select {
border-radius: 10px; /* Ajusta el radio del borde */
background-color: #e3f2fd; /* Color de fondo */
color: #1976d2; /* Color del texto */
font-size: 1rem; /* Tamaño de fuente */
padding: 0.5rem 1rem; /* Padding interno */
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
margin: 0 auto; /* Centrar horizontalmente */
margin-top: 7px;
height: 40px
}
/* Estilos para cuando el select tiene foco */
.form-select:focus {
border-color: #80bdff;
outline: 0;
box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
}
/* Estilos para las opciones del select */
.form-select option {
background-color: #e3f2fd; /* Color de fondo */
color: #1976d2; /* Color del texto */
}
h4 {
margin-top: 30px;
color: #6F6F6F;
}
.list-group-item:hover,
.list-group-item:focus {
background-color: #f8f9fa;
}
.list-group-item:has(input:checked) {
background-color: #e3f2fd;
}
.form-control {
background-color: #e3f2fd; /* Color de fondo */
color: #1976d2; /* Color del texto */
}
textarea[readonly] {
background-color: #ccc; /* Cambia el color de fondo del textarea en modo de solo lectura */
}
</style>
</head>
<body>
<nav class="navbar navbar-dark bg-primary">
<span class="navbar-brand mb-0 h1 me-1">
Bienvenida/o, <span th:text="${alumno.nombre + ' ' + alumno.apellido1}"></span> (NIA: <span th:text="${alumno.nia}"></span>)
</span>
<a href="/registro" class="btn btn-danger btn-sm me-2">
<i class="fas fa-sign-out-alt"></i> Salir
</a>
</nav>
<nav class="navbar navbar-light" style="background-color: #e3f2fd; padding-top: 0; padding-bottom: 0;">
<div class="container-fluid">
<span class="navbar-text mx-auto" style="font-size: 30px; color:#6F6F6F">
<b>Información Adicional</b>
</span>
</div>
</nav>
<div class="container" style="margin-bottom: 50px;">
<form action="/actualizarAlumno" method="POST" id="enviar">
<div class="row">
<div class="col-md-6">
<h4>¿Quiere participar en el AMPA?</h4>
<ul class="list-group">
<li class="list-group-item">
<input class="form-check-input me-1" type="radio" value="si" id="si2" name="opcion2">
<label class="form-check-label stretched-link" for="si2">Si</label>
</li>
<li class="list-group-item">
<input class="form-check-input me-1" type="radio" value="no" id="no2" name="opcion2">
<label class="form-check-label stretched-link" for="no2">No</label>
</li>
</ul>
</div>
<div class="col-md-6">
<h4>¿Existe alguna limitación de la Patria Potestad en virtud de Resolución Judicial? </h4>
<ul class="list-group">
<li class="list-group-item">
<input class="form-check-input me-1" type="radio" value="si" id="si3" name="opcion3">
<label class="form-check-label stretched-link" for="si3">Si</label>
</li>
<li class="list-group-item">
<input class="form-check-input me-1" type="radio" value="no" id="no3" name="opcion3">
<label class="form-check-label stretched-link" for="no3">No</label>
</li>
</ul>
<textarea class="form-control mt-2" id="textBox1" readonly rows="1" name="limitaciontxt"></textarea>
</div>
<div class="col-md-6">
<h4>¿Sufre alguna patologia?</h4>
<ul class="list-group">
<li class="list-group-item">
<input class="form-check-input me-1" type="radio" value="si" id="si4" name="opcion4">
<label class="form-check-label stretched-link" for="si4">Si</label>
</li>
<li class="list-group-item">
<input class="form-check-input me-1" type="radio" value="no" id="no4" name="opcion4">
<label class="form-check-label stretched-link" for="no4">No</label>
</li>
</ul>
<select id="select1" class="form-select form-select-lg" name="patologiaSeleccionada" hidden>
<option hidden="hidden"></option>
<option th:each="patologia : ${patologias}" th:text="${patologia.nombre}"></option>
</select>
</div>
<div class="col-md-6">
<h4>¿Toma alguna medicación?</h4>
<ul class="list-group">
<li class="list-group-item">
<input class="form-check-input me-1" type="radio" value="si" id="si5" name="opcion5">
<label class="form-check-label stretched-link" for="si5">Si</label>
</li>
<li class="list-group-item">
<input class="form-check-input me-1" type="radio" value="no" id="no5" name="opcion5">
<label class="form-check-label stretched-link" for="no5">No</label>
</li>
</ul>
<textarea class="form-control mt-2" id="textBox2" readonly rows="1" name="medicaciontxt"></textarea>
</div>
<div class="col-md-6">
<h4>Nombre y apellidos de madre, padre o tutor legal:</h4>
<textarea class="form-control mt-2" id="textBox3" rows="1"
name="madretxt"></textarea>
</div>
<div class="col-md-6">
<h4>Parentesco:</h4>
<select id="select2" class="form-select form-select-lg" name="parentescotxt">
<option hidden="hidden"></option>
<option>Madre</option>
<option>Padre</option>
<option>Tutor legal</option>
</select>
</div>
</div>
<div class="container my-4">
<div class="row justify-content-end">
<div class="col-auto">
<a class="btn btn-primary btn-lg" onclick="Enviar()">Enviar &rarr;</a>
</div>
</div>
</div>
</form>
</div>
<script>
const si3 = document.getElementById('si3');
const no3 = document.getElementById('no3');
const si4 = document.getElementById('si4');
const no4 = document.getElementById('no4');
const si5 = document.getElementById('si5');
const no5 = document.getElementById('no5');
const textBox1 = document.getElementById('textBox1');
const textBox2 = document.getElementById('textBox2');
const textBox3 = document.getElementById('textBox3');
const select1 = document.getElementById('select1');
const select2 = document.getElementById('select2');
function ajustarAlturaTextArea(textArea) {
textArea.style.height = 'auto';
textArea.style.height = (textArea.scrollHeight) + 'px';
}
function vaciarTextArea(textArea) {
textArea.value = '';
ajustarAlturaTextArea(textArea);
}
si3.addEventListener('change', function() {
if (this.checked) {
textBox1.removeAttribute('readonly'); // Quita el modo de solo lectura
textBox1.placeholder = 'Explique...';
textBox1.value = ''; // Borra el contenido del campo de texto
ajustarAlturaTextArea(textBox1); // Ajusta la altura del campo de texto si es necesario
} else {
textBox1.readOnly = true; // Establece el campo en modo de solo lectura
textBox1.value = ''; // Borra el contenido del campo de texto
}
});
no3.addEventListener('change', function() {
if (this.checked) {
textBox1.readOnly = true; // Establece el campo en modo de solo lectura
textBox1.placeholder = ' ';
textBox1.value = ''; // Borra el contenido del campo de texto
}
});
si4.addEventListener('change', function() {
if (this.checked) {
select1.selectedIndex = 0; // Restablece la selección del elemento select
select1.hidden = false;
}
});
no4.addEventListener('change', function() {
if (this.checked) {
select1.selectedIndex = 0; // Restablece la selección del elemento select
select1.hidden = true;
}
});
si5.addEventListener('change', function() {
if (this.checked) {
textBox2.removeAttribute('readonly'); // Quita el modo de solo lectura
textBox2.placeholder = 'Explique...';
textBox2.value = ''; // Borra el contenido del campo de texto
ajustarAlturaTextArea(textBox2); // Ajusta la altura del campo de texto si es necesario
} else {
textBox2.readOnly = true; // Establece el campo en modo de solo lectura
textBox2.value = ''; // Borra el contenido del campo de texto
}
});
no5.addEventListener('change', function() {
if (this.checked) {
textBox2.readOnly = true; // Establece el campo en modo de solo lectura
textBox2.placeholder = '';
textBox2.value = ''; // Borra el contenido del campo de texto
}
});
[textBox1, textBox2, textBox3].forEach(textArea => {
textArea.addEventListener('input', () => ajustarAlturaTextArea(textArea));
});
select1.addEventListener('change', function() {
if (select1.selectedIndex === 0) {
select1.setCustomValidity('required');
} else {
select1.setCustomValidity('');
}
});
select2.addEventListener('change', function() {
if (select2.selectedIndex === 0) {
select2.setCustomValidity('required');
} else {
select2.setCustomValidity('');
}
});
function Enviar() {
const elementos = document.querySelectorAll('.form-check-input, .form-control, .form-select');
elementos.forEach(elemento => {
elemento.style.border = '1px solid #ced4da';
});
let error = false;
if (!si2.checked && !no2.checked) {
alert('Por favor, completa el campo de si desea participar en el AMPA.');
error = true;
si2.parentNode.style.border = '1px solid red';
no2.parentNode.style.border = '1px solid red';
}
if (si3.checked && textBox1.value.trim() === '') {
alert('Por favor, completa el campo de explicación para la limitación.');
error = true;
textBox1.style.border = '1px solid red';
} else if (!si3.checked && !no3.checked) {
alert('Por favor, completa el campo de si tiene alguna limitación.');
error = true;
si3.parentNode.style.border = '1px solid red';
no3.parentNode.style.border = '1px solid red';
}
if (si4.checked && select1.value === '') {
alert('Por favor, selecciona una patología.');
error = true;
select1.style.border = '1px solid red';
} else if (!si4.checked && !no4.checked) {
alert('Por favor, completa el campo de si tiene alguna patología.');
error = true;
si4.parentNode.style.border = '1px solid red';
no4.parentNode.style.border = '1px solid red';
}
if (si5.checked && textBox2.value.trim() === '') {
alert('Por favor, completa el campo de explicación para la medicación.');
error = true;
textBox2.style.border = '1px solid red';
} else if (!si5.checked && !no5.checked) {
alert('Por favor, completa el campo de si toma alguna medicación.');
error = true;
si5.parentNode.style.border = '1px solid red';
no5.parentNode.style.border = '1px solid red';
}
if (textBox3.value.trim() === '') {
alert('Por favor, completa el campo del nombre de la madre.');
error = true;
textBox3.style.border = '1px solid red';
}
if(select2.value === '') {
alert('Por favor, selecciona el parentesco.');
error = true;
select2.style.border = '1px solid red';
}
if (!error) {
document.getElementById('enviar').submit();
}
}
</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"
integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz"
crossorigin="anonymous"></script>
</body>
</html>

@ -0,0 +1,115 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>NIA Encontrado</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<style>
.custom-box {
background-color: #f0f0f0;
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.3);
padding: 20px;
margin-bottom: 20px;
border-radius: 10px;
text-align: center;
transition: box-shadow 0.3s ease;
}
.container-custom {
margin-top: 50px;
}
.custom-box a {
display: block;
text-decoration: none;
color: inherit;
}
.custom-box p {
font-weight: bold;
font-size: 30px;
}
.custom-box.clicked {
box-shadow: 0px 0px 20px rgba(0, 255, 0, 1);
}
</style>
</head>
<body>
<nav class="navbar navbar-dark bg-primary">
<span class="navbar-brand mb-0 h1">
Bienvenida/o, <span th:text="${alumno.nombre + ' ' + alumno.apellido1}"></span> (NIA: <span th:text="${alumno.nia}"></span>)
Tu matricula actual es: <span th:text="${alumno.matActual}"></span>
</span>
<a href="/registro" class="btn btn-danger btn-sm">
<i class="fas fa-sign-out-alt"></i> Salir
</a>
</nav>
<nav class="navbar navbar-light" style="background-color: #e3f2fd; padding-top: 0; padding-bottom: 0;">
<div class="container-fluid">
<span class="navbar-text mx-auto" style="font-size: 30px;">
EDU &rarr; <b>Familia</b> &rarr; Ciclo &rarr; Curso
</span>
</div>
</nav>
<div th:if="${eduSeleccionado}">
<p>Has seleccionado: <span th:text="${eduSeleccionado}"></span></p>
</div>
<div class="container-custom">
<div class="container my-4">
<div class="row">
<div class="col-md-6" th:each="opcion : ${familias}">
<a th:href="@{/ciclo(opcion=${opcion.nombre})}" class="clickable-box">
<div class="custom-box">
<p th:text="${opcion.nombre}"></p>
</div>
</a>
</div>
</div>
</div>
</div>
<div class="container my-4">
<div class="row justify-content-between">
<div class="col-auto">
<a href="/principal" class="btn btn-primary btn-lg">&larr; Atrás</a>
</div>
<div class="col-auto">
<a class="btn btn-primary btn-lg" onclick="redirectToCiclo()">Siguiente &rarr;</a>
</div>
</div>
</div>
<script>
let familiaSeleccionada = null; // Variable global para almacenar la opción seleccionada
const clickableBoxes = document.querySelectorAll('.clickable-box');
clickableBoxes.forEach(box => {
box.addEventListener('click', function(event) {
// Evitar que el evento de clic en las opciones provoque la redirección
event.preventDefault();
document.querySelectorAll('.custom-box').forEach(box => {
box.classList.remove('clicked');
});
const customBox = this.querySelector('.custom-box');
customBox.classList.add('clicked');
// Guardar la opción seleccionada en la variable global
familiaSeleccionada = customBox.querySelector('p').textContent;
console.log('Familia seleccionada:', familiaSeleccionada);
});
});
// Función para redirigir a la página de ciclo solo si hay una opción seleccionada
function redirectToCiclo() {
if (familiaSeleccionada) {
window.location.href = '/ciclo?fam=' + familiaSeleccionada;
} else {
alert('Por favor, selecciona una opción antes de continuar.');
}
}
</script>
</body>
</html>

@ -0,0 +1,133 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Resumen de Información</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.3/jspdf.umd.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.9.2/html2pdf.bundle.min.js"></script>
<script src="https://kit.fontawesome.com/a076d05399.js"></script>
</head>
<body>
<nav class="navbar navbar-dark bg-primary">
<span class="navbar-brand mb-0 h1 text-center w-100" style="font-size: 30px;">
FINALIZADO
</span>
</nav>
<!--<div th:if="${errorCorreo}" class="alert alert-danger" role="alert">
<nav class="navbar navbar-light" style="padding-top: 0; padding-bottom: 0;">
<div class="container-fluid">
<span class="navbar-text mx-auto" style="font-size: 20px;">
No se le ha podido enviar la información a través del correo
</span>
</div>
</nav>
</div>
<div th:if="${errorCorreo == null}">
<nav class="navbar navbar-light" style="background-color: #e3f2fd; padding-top: 0; padding-bottom: 0;">
<div class="container-fluid">
<span class="navbar-text mx-auto" style="font-size: 20px;">
Toda esta información se le ha sido enviada a través de tu correo electrónico
</span>
</div>
</nav>
</div> -->
<nav class="navbar navbar-light" style="background-color: #e3f2fd; padding-top: 0; padding-bottom: 0;">
<div class="container-fluid">
<span class="navbar-text mx-auto" style="font-size: 20px;">
Por favor, guarde e imprima el archivo PDF que se ha descargado, ya que constituye el resguardo de su matrícula.
</span>
</div>
</nav>
<div class="container">
<div class="row" id="content-to-pdf">
<div class="col-md-6 mx-auto">
<div class="card mt-5">
<div class="card-header" >
<h2 class="text-center">Resumen de Matrícula</h2>
</div>
<div class="card-body">
<h5>Información del Alumno:</h5>
<p><b>Nombre: </b><span th:text="${alumno.nombre}"></span></p>
<p><b>Apellidos: </b><span th:text="${alumno.apellido1 + (alumno.apellido2 != null ? ' ' + alumno.apellido2 : '')}"></span></p>
<p><b>Correo 1: </b><span th:text="${alumno.correo1}"></span></p>
<p><b>DNI: </b><span th:text="${alumno.dni}"></span></p>
<p><b>Fecha de Nacimiento: </b><span th:text="${#dates.format(alumno.fechaNacimiento, 'dd/MM/yyyy')}"></span></p>
<p th:if="${alumno.limitacion}"><b>Limitación: </b><span th:text="${alumno.txtLimitacion}"></span></p>
<p th:if="${alumno.ampa}"><b>AMPA:</b> <span th:text="${alumno.ampa ? 'Sí' : 'No'}"></span></p>
<p th:if="${alumno.patologia != null}"><b>Patología: </b><span th:text="${alumno.patologia.nombre}"></span></p>
<p th:if="${alumno.medicacion != null && !#strings.isEmpty(alumno.medicacion)}"><b>Medicación: </b><span th:text="${alumno.medicacion}"></span></p>
<p th:if="${alumno.txtFirma != null}"><b>Firma: </b><span th:text="${alumno.txtFirma}"></span></p>
<p th:if="${alumno.nombreApellidoPadre != null}"><b>Nombre del Padre: </b><span th:text="${alumno.nombreApellidoPadre}"></span></p>
<p th:if="${alumno.nombreApellidoMadre != null}"><b>Nombre de la Madre: </b><span th:text="${alumno.nombreApellidoMadre}"></span></p>
<p th:if="${alumno.parentesco != null}"><b>Parentesco: </b><span th:text="${alumno.parentesco}"></span></p>
<h5>Información de la Matrícula:</h5>
<p><b>Curso: </b><span th:text="${matriculacion.cursoCiclo.curso.numero}"></span></p>
<p><b>Ciclo: </b><span th:text="${matriculacion.cursoCiclo.ciclo.nombre}"></span></p>
<p th:if="${matriculacion.optativas.size() > 0}"><b>Optativas:</b></p>
<ul>
<li th:each="optativa, optativaIndex : ${matriculacion.optativas}"
th:if="${optativa.orden > 0}"
th:text="${optativaIndex.count + '. ' + optativa.modulo.nombre}"></li>
</ul>
<div th:if="${matriculacion.optativas.?[modulo.bloque == 1 || modulo.bloque == 2 || modulo.bloque == 3 || modulo.bloque > 6].size() > 0}">
<p><b>Materias de opción:</b></p>
<ul>
<li th:each="optativa : ${matriculacion.optativas}"
th:if="${optativa.orden == 0 && (optativa.modulo.bloque == 1 || optativa.modulo.bloque == 2 || optativa.modulo.bloque == 3 || optativa.modulo.bloque > 6)}"
th:text="${optativa.modulo.nombre}"></li>
</ul>
<div th:if="${alumno.extItinerario > 0}">
<p><b>Materia opción extra:</b></p>
<ul>
<li th:text="${extItinerarioNombre}"></li>
</ul>
</div>
</div>
<div th:if="${matriculacion.optativas.![modulo.bloque == 4].size() > 0}">
<p><b>Religión/Atención Educativa:</b></p>
<ul>
<li th:each="optativa : ${matriculacion.optativas}"
th:if="${optativa.orden == 0 && optativa.modulo.bloque == 4}"
th:text="${optativa.modulo.nombre}"></li>
</ul>
</div>
<div th:if="${matriculacion.optativas.?[modulo.bloque == 5].size() > 0}">
<p><b>Matemáticas:</b></p>
<ul>
<li th:each="optativa : ${matriculacion.optativas}"
th:if="${optativa.orden == 0 && optativa.modulo.bloque == 5}"
th:text="${optativa.modulo.nombre}"></li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="row mt-3">
<div class="col-md-6 mx-auto text-center" style="margin-bottom: 30px">
<a href="#" onclick="location.reload();" class="btn btn-danger btn-block" id="download-pdf">
<i class="fas fa-sync-alt"></i> Salir
</a>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
var nia = '[[${alumno.nia}]]';
var nombre = '[[${alumno.nombre}]]';
var content = document.getElementById('content-to-pdf');
html2pdf().from(content).save(nombre + ' ' + nia + '.pdf');
});
</script>
</body>
</html>

@ -0,0 +1,333 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>NIA Encontrado</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<style>
/* Estilos para el select */
.form-select {
border-radius: 10px; /* Ajusta el radio del borde */
background-color: #e3f2fd; /* Color de fondo */
color: #1976d2; /* Color del texto */
font-size: 1rem; /* Tamaño de fuente */
padding: 0.5rem 1rem; /* Padding interno */
border: 2px solid #1976d2; /* Borde */
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
width: 100%; /* Ancho completo */
max-width: 500px; /* Máximo ancho */
margin: 0 auto; /* Centrar horizontalmente */
margin-top: 10px;
}
/* Estilos para cuando el select tiene foco */
.form-select:focus {
border-color: #80bdff;
outline: 0;
box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
}
.form-select.required {
border-color: #FF0000; /* Color del borde rojo por defecto */
}
/* Estilos para las opciones del select */
.form-select option {
background-color: #e3f2fd; /* Color de fondo */
color: #1976d2; /* Color del texto */
}
/* Margen superior para el contenedor de los selects */
.select-container {
margin-top: 30px;
width: 100%; /* Ancho completo */
max-width: 500px; /* Máximo ancho */
margin: 0 auto; /* Centrar horizontalmente */
}
.descripcion, h5 {
text-align: center;
margin-top: 20px;
color: #6C6C6C;
}
.prioridad {
text-align: center;
margin-top: 10px;
color: #6C6C6C;
font-weight: bold;
font-size: 20px;
}
.error {
text-align: center;
margin-top: 20px;
font-weight: bold;
color: #FF0000;
}
.form-textarea::placeholder {
color: #1976d2; /* Color del texto del placeholder */
}
.form-textarea {
border-radius: 10px;
background-color: #e3f2fd;
color: #1976d2;
font-size: 1rem;
padding: 0.5rem 1rem;
border: 2px solid #1976d2;
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
width: 100%;
max-width: 500px;
margin: 0 auto;
margin-top: 10px;
}
.form-textarea:focus {
border-color: #80bdff;
outline: 0;
box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
}
.obligatorias {
font-size: 20px;
text-align: center;
}
</style>
</head>
<body>
<nav class="navbar navbar-dark bg-primary">
<span class="navbar-brand mb-0 h1">
Bienvenida/o, <span th:text="${alumno.nombre + ' ' + alumno.apellido1}"></span> (NIA: <span th:text="${alumno.nia}"></span>)
</span>
<a href="/registro" class="btn btn-danger btn-sm">
<i class="fas fa-sign-out-alt"></i> Salir
</a>
</nav>
<nav class="navbar navbar-light" style="background-color: #e3f2fd; padding-top: 0; padding-bottom: 0;">
<div class="container-fluid">
<span class="navbar-text mx-auto" style="font-size: 30px;">
<b>Optativas <span th:if="${esRepetidor}">repetidor</span> <span th:text="${cursoCiclo.curso.numero + ' ' + cursoCiclo.ciclo.codigo}"></span></b>
<p class="obligatorias" th:if="${obligatorias != null}">Obligatorias: <span th:each="obligatoria, ', ' : ${obligatorias}" th:text="${obligatoria.nombre}" ></span></p>
</span>
</div>
</nav>
<h4 th:if="${!esRepetidor}" class="descripcion">Selecciona las optativas por orden de prioridad</h4>
<h4 th:if="${esRepetidor}" class="descripcion">Selecciona tu taller de refuerzo por prioridad</h4>
<p th:text="${error}" class="error"></p>
<form id="optativasForm" action="/actualizarOptativas" method="post">
<div class="container">
<div class="select-container">
<div th:each="modulo, iterStat: ${modulos}" th:unless="${(esTercero and !esRepetidor) and iterStat.last}">
<div class="row justify-content-center mb-3">
<div class="col mb-3">
<div class="d-flex align-items-center">
<span class="prioridad" th:text="${iterStat.count} + '.'"></span>
<select class="form-select form-select-lg required" name="opcionesSeleccionadas" id="moduloSeleccionado_{{iterStat.index}}">
<option value="" disabled selected hidden></option>
<option th:each="modulo : ${modulos}" th:text="${modulo.nombre}"></option>
</select>
</div>
</div>
</div>
</div>
<div th:if="${!esRepetidor} and ${!esBachiller}" class="row justify-content-center" style="margin-top: 10px;">
<div class="col mb-3">
<h5>Escribe tu optativa del curso pasado</h5>
<textarea class="form-textarea mt-2" id="textBoxOp" placeholder="Escribe si quieres..." rows="1"
name="optPasada" style=""></textarea>
</div>
</div>
</div>
</div>
<div th:if="${esBachiller == null} or ${!esBachiller}">
<nav class="navbar navbar-light" style="background-color: #e3f2fd; padding-top: 0; padding-bottom: 0; margin-top: 30px;">
<div class="container-fluid">
<span class="navbar-text mx-auto" style="font-size: 30px;">
<b>Religión/Atención educativa</b>
</span>
</div>
</nav>
<div class="container">
<div class="select-container" style="margin-top: 10px;">
<div class="row justify-content-center">
<div class="col mb-3">
<select class="form-select form-select-lg required" name="opcionesSeleccionadas">
<option value="" disabled selected hidden></option>
<option th:each="bloque4 : ${bloques4}" th:text="${bloque4.nombre}"></option>
</select>
</div>
</div>
</div>
</div>
</div>
<div class="bloqueMateriasDeOpcion" th:if="${esCuarto} or ${esBachiller}">
<nav class="navbar navbar-light" style="background-color: #e3f2fd; padding-top: 0; padding-bottom: 0; margin-top: 30px;">
<div class="container-fluid">
<span class="navbar-text mx-auto" style="font-size: 30px;">
<b>
<span th:if="${esCuarto}">Materias de opción</span>
<span th:if="${esBachiller}">Modalidades</span>
</b>
</span>
</div>
</nav>
<h4 class="descripcion">
<span th:if="${esCuarto}">Selecciona tus materias de opción</span>
<span th:if="${esBachiller}">Selecciona tu modalidades</span>
</h4>
<div class="container">
<div class="select-container" style="margin-top: 30px;">
<div class="row justify-content-center">
<div class="col mb-3" th:if="${bloques1 != null}">
<select class="form-select form-select-lg required" name="opcionesSeleccionadas" id="bloque1">
<option value="" disabled selected hidden></option>
<option th:each="bloque1 : ${bloques1}" th:text="${bloque1.nombre}"></option>
</select>
</div>
</div>
<div class="row justify-content-center" th:if="${bloques2 != null}">
<div class="col mb-3">
<select class="form-select form-select-lg required" name="opcionesSeleccionadas" id="bloque2">
<option value="" disabled selected hidden></option>
<option th:each="bloque2 : ${bloques2}" th:text="${bloque2.nombre}"></option>
</select>
</div>
</div>
<div class="row justify-content-center" th:if="${bloques3 != null}">
<div class="col mb-3">
<select class="form-select form-select-lg required" name="opcionesSeleccionadas" id="bloque3">
<option value="" disabled selected hidden></option>
<option th:each="bloque3 : ${bloques3}" th:text="${bloque3.nombre}"></option>
</select>
</div>
</div>
<div class="row justify-content-center" style="margin-top: 10px;" th:if="${esCuarto}">
<div class="col mb-3">
<h5>Alguna de las materias de opción que te gustarian cursar, no la has podido seleccionar por
la manera en que se han estrucutrado los bloques de matérias?</h5>
<select class="form-select form-select-lg required" id="extItinerario" name="extItinerario">
<option value="" disabled selected hidden></option>
<option th:each="extItinerario : ${bloqueExtItinerario}" th:text="${extItinerario.nombre}"></option>
</select>
</div>
</div>
</div>
</div>
<div th:if="${!esBachiller}">
<nav class="navbar navbar-light" style="background-color: #e3f2fd; padding-top: 0; padding-bottom: 0; margin-top: 30px;">
<div class="container-fluid">
<span class="navbar-text mx-auto" style="font-size: 30px;">
<b>Matemáticas</b>
</span>
</div>
</nav>
<h4 class="descripcion">Selecciona tus matemáticas</h4>
<div class="container">
<div class="select-container" style="margin-top: 30px;">
<div class="row justify-content-center">
<div class="col mb-3">
<select class="form-select form-select-lg required" name="opcionesSeleccionadas">
<option value="" disabled selected hidden></option>
<option th:each="bloque5 : ${bloques5}" th:text="${bloque5.nombre}"></option>
</select>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="container my-4">
<div class="row justify-content-end">
<div class="col-auto">
<button type="button" class="btn btn-primary btn-lg" onclick="guardarYEnviar(), disableButton(this);">Siguiente &rarr;</button>
</div>
</div>
</div>
</form>
<script>
function guardarYEnviar() {
var selects = document.querySelectorAll('.form-select');
var allSelected = true;
var inteligencia1Selected = false;
var inteligencia2Selected = false;
selects.forEach(function(select) {
if (select.value === '' && select.id !== 'extItinerario') {
allSelected = false;
}
if (select.value === '(I) Programación, inteligencia artificial y robótica') {
inteligencia1Selected = true;
} else if (select.value === '(II) Programación, inteligencia artificial y robótica') {
inteligencia2Selected = true;
}
});
if (inteligencia1Selected && inteligencia2Selected) {
alert('No puedes seleccionar primero y segundo de "Programación, inteligencia artificial y robótica" juntos.');
return;
}
if (!allSelected) {
alert('Por favor, selecciona una opción en cada campo.');
return;
}
var opcionesSeleccionadas = [];
selects.forEach(function(select) {
opcionesSeleccionadas.push(select.value);
});
var campoOcultoOptativas = document.createElement("input");
campoOcultoOptativas.setAttribute("type", "hidden");
campoOcultoOptativas.setAttribute("name", "opcionesSeleccionadas");
campoOcultoOptativas.setAttribute("value", JSON.stringify(opcionesSeleccionadas));
document.getElementById("optativasForm").appendChild(campoOcultoOptativas);
document.getElementById("optativasForm").submit();
}
document.querySelectorAll('.form-select').forEach(function(select) {
select.addEventListener('change', function() {
var selectedOption = this.value;
var allSelects = document.querySelectorAll('.form-select');
var duplicateFound = false; // Variable para rastrear si se encontró una opción duplicada
allSelects.forEach(function(sel) {
if (!duplicateFound && sel !== select && sel.value === selectedOption) {
sel.value = '';
sel.classList.add('required');
duplicateFound = true; // Marcar que se ha encontrado una opción duplicada
}
});
// Cambiar la clase del borde una vez se haya seleccionado algo
if (selectedOption !== '') {
this.classList.remove('required'); // Eliminar la clase de borde rojo
} else {
this.classList.add('required'); // Si se deja vacío, volver al borde rojo
}
});
});
function disableButton(button) {
// Deshabilitar el botón
button.disabled = true;
// Cambiar el texto del botón para indicar que está cargando
button.innerText = 'Enviando...';
// Rehabilitar el botón después de 10 segundos
setTimeout(function() {
button.disabled = false;
button.innerText = 'Enviar';
}, 10000); // 10000 milisegundos = 10 segundos
}
</script>
</body>
</html>

@ -0,0 +1,108 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>NIA Encontrado</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<style>
.custom-box {
background-color: #f0f0f0;
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.3);
padding: 20px;
margin-bottom: 20px;
border-radius: 10px;
text-align: center;
transition: box-shadow 0.3s ease;
}
.container-custom {
margin-top: 50px;
}
.custom-box a {
display: block;
text-decoration: none;
color: inherit;
}
.custom-box p {
font-weight: bold;
font-size: 30px;
}
.custom-box.clicked {
box-shadow: 0px 0px 20px rgba(0, 255, 0, 1);
}
</style>
</head>
<body>
<nav class="navbar navbar-dark bg-primary">
<span class="navbar-brand mb-0 h1">
Bienvenida/o, <span th:text="${alumno.nombre + ' ' + alumno.apellido1}"></span> (NIA: <span th:text="${alumno.nia}"></span>)
</span>
<span class="navbar-brand mb-01 h1" style="margin-right: 300px;">Tu matricula actual es: <span th:text="${alumno.matActual}"></span></span>
<a href="/registro" class="btn btn-danger btn-sm">
<i class="fas fa-sign-out-alt"></i> Salir
</a>
</nav>
<nav class="navbar navbar-light" style="background-color: #e3f2fd; padding-top: 0; padding-bottom: 0;">
<div class="container-fluid">
<span class="navbar-text mx-auto" style="font-size: 30px;">
<b>EDU</b> &rarr; Familia &rarr; Ciclo &rarr; Curso
</span>
</div>
</nav>
<div class="container-custom">
<div class="container my-4">
<div class="row">
<div class="col-md-6" th:each="opcion : ${edus}">
<a th:href="@{/familia(opcion=${opcion.nombre})}" class="clickable-box">
<div class="custom-box">
<p th:text="${opcion.nombre}"></p>
</div>
</a>
</div>
</div>
</div>
</div>
<div class="container my-4">
<div class="row justify-content-end">
<div class="col-auto">
<button class="btn btn-primary btn-lg" onclick="redirectToFamily()">Siguiente &rarr;</button>
</div>
</div>
</div>
<script>
let eduSeleccionado = null; // Variable global para almacenar la opción seleccionada
const clickableBoxes = document.querySelectorAll('.clickable-box');
clickableBoxes.forEach(box => {
box.addEventListener('click', function(event) {
// Evitar que el evento de clic en las opciones provoque la redirección
event.preventDefault();
document.querySelectorAll('.custom-box').forEach(box => {
box.classList.remove('clicked');
});
const customBox = this.querySelector('.custom-box');
customBox.classList.add('clicked');
// Guardar la opción seleccionada en la variable global
eduSeleccionado = customBox.querySelector('p').textContent;
});
});
// Función para redirigir a la página de familia solo si hay una opción seleccionada
function redirectToFamily() {
if (eduSeleccionado) {
window.location.href = '/familia?edu=' + eduSeleccionado;
} else {
alert('Por favor, selecciona una opción antes de continuar.');
}
}
</script>
</body>
</html>

@ -0,0 +1,50 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>Encuesta Optativas</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container text-center align-middle col-md-5">
<div >
<h1>Matrícula</h1>
</div>
<div class="text-center form-group" >
<div th:if="${mensaje}" class="alert alert-success" role="alert">
<p th:text="${mensaje}"></p>
</div>
<div th:if="${errorNia}" class="alert alert-danger" role="alert">
<p th:text="${errorNia}"></p>
</div>
<div th:if="${errorContraseña}" class="alert alert-danger" role="alert">
<p th:text="${errorContraseña}"></p>
</div>
<form th:action="@{/registro/comprobarNia}" method="post">
<div class="input-group input-group-lg col-md-12 mb-3">
<div class="input-group-prepend">
<span class="input-group-text" for="nia">NIA:</span>
</div>
<input id="nia" name="nia" required type="text" class="form-control" aria-label="Large" aria-describedby="inputGroup-sizing-sm">
</div>
<div class="input-group input-group-lg col-md-12 mb-3">
<div class="input-group-prepend">
<span class="input-group-text" for="contrasenya">CLAVE:</span>
</div>
<input id="contrasenya" name="contrasenya" required type="password" class="form-control" aria-label="Large" aria-describedby="inputGroup-sizing-sm">
</div>
<button type="submit" class="btn btn-primary">Acceder</button>
</form>
</div>
</div>
</body>
</html>

@ -0,0 +1,13 @@
package com.proyecto.prematricula;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class PrematriculaApplicationTests {
@Test
void contextLoads() {
}
}
Loading…
Cancel
Save

Powered by INFORMATICA.FP.EDU.ES.