diff --git a/Dockerfile b/Dockerfile
index 22070bd1..ceacf16e 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
FROM amazoncorretto:17.0.8-alpine3.17
EXPOSE 8080
ADD /target/tendermanagement-0.0.1-SNAPSHOT.jar tendermanagement-0.0.1-SNAPSHOT.jar
-ENTRYPOINT ["java", "-jar","tendermanagement-0.0.1-SNAPSHOT.jar"]
\ No newline at end of file
+ENTRYPOINT ["java", "-jar","tendermanagement-0.0.1-SNAPSHOT.jar"]
diff --git a/Jenkinsfile b/Jenkinsfile
index 968d3a2b..d488b39e 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -56,7 +56,7 @@ pipeline {
}
}
script {
- sh 'ssh ubuntu@46.105.65.89 "sh gepafin-production-api.sh"'
+ sh 'ssh ubuntu@79.137.88.15 "sh gepafin-production-api.sh"'
}
}
}
diff --git a/pom.xml b/pom.xml
index 55765564..a2a1e712 100644
--- a/pom.xml
+++ b/pom.xml
@@ -116,10 +116,6 @@
jjwt-jackson
0.11.5
-
- org.springframework.boot
- spring-boot-starter-web
-
jakarta.validation
jakarta.validation-api
@@ -139,14 +135,58 @@
problem-spring-web
0.23.0
+
+
+
+ org.springframework.security
+ spring-security-saml2-service-provider
+
+
+
+
+ org.opensaml
+ opensaml-core
+ 4.2.0
+
+
+
+
+
+ org.opensaml
+ opensaml-saml-api
+ 4.2.0
+
+
+
+
+
+ org.opensaml
+ opensaml-saml-impl
+ 4.2.0
+
+
+
org.springframework.cloud
spring-cloud-starter-openfeign
4.1.3
+
+
+ org.apache.santuario
+ xmlsec
+ 2.3.0
+
+
+
+
+ shibboleth
+ https://build.shibboleth.net/nexus/content/repositories/releases/
+
+
@@ -158,7 +198,6 @@
org.liquibase
liquibase-maven-plugin
- 4.20.0
src/main/resources/application.properties
diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java
new file mode 100644
index 00000000..c66e26f1
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java
@@ -0,0 +1,203 @@
+package net.gepafin.tendermanagement.config;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.security.KeyFactory;
+import java.security.PrivateKey;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.time.Instant;
+import java.util.UUID;
+
+import org.bouncycastle.util.io.pem.PemReader;
+import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
+import org.opensaml.saml.common.SAMLVersion;
+import org.opensaml.saml.common.xml.SAMLConstants;
+import org.opensaml.saml.saml2.core.AuthnContextClassRef;
+import org.opensaml.saml.saml2.core.AuthnContextComparisonTypeEnumeration;
+import org.opensaml.saml.saml2.core.AuthnRequest;
+import org.opensaml.saml.saml2.core.RequestedAuthnContext;
+import org.opensaml.saml.saml2.core.impl.AuthnContextClassRefBuilder;
+import org.opensaml.saml.saml2.core.impl.RequestedAuthnContextBuilder;
+import org.opensaml.security.x509.BasicX509Credential;
+import org.opensaml.xmlsec.config.impl.DefaultSecurityConfigurationBootstrap;
+import org.opensaml.xmlsec.signature.Signature;
+import org.opensaml.xmlsec.signature.support.SignatureConstants;
+import org.opensaml.xmlsec.signature.support.Signer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.saml2.core.Saml2X509Credential;
+import org.springframework.security.saml2.provider.service.registration.InMemoryRelyingPartyRegistrationRepository;
+import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistration;
+import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository;
+import org.springframework.security.saml2.provider.service.registration.Saml2MessageBinding;
+import org.springframework.security.saml2.provider.service.web.DefaultRelyingPartyRegistrationResolver;
+import org.springframework.security.saml2.provider.service.web.RelyingPartyRegistrationResolver;
+import org.springframework.security.saml2.provider.service.web.authentication.OpenSaml4AuthenticationRequestResolver;
+import org.springframework.security.saml2.provider.service.web.authentication.Saml2AuthenticationRequestResolver;
+
+@Configuration
+public class SamlConfig {
+
+ private final Logger logger = LoggerFactory.getLogger(SamlConfig.class);
+
+ @Value("${base-url}")
+ String baseUrl;
+
+ @Value("${spid.ipd.base.url}")
+ String ipdBaseUrl;
+
+ @Value("${active.profile.folder}")
+ String activeProfileFolder;
+
+ @Bean
+ public RelyingPartyRegistrationRepository relyingPartyRegistrationRepository() {
+
+ String entityId = baseUrl + "/v1/saml/gw/metadata";
+ String acsUrl = baseUrl + "/login/saml2/sso/loginumbria";
+
+ RelyingPartyRegistration registration = RelyingPartyRegistration.withRegistrationId("loginumbria")
+ .entityId(entityId)
+ .signingX509Credentials(credentials -> {
+ try {
+ credentials.add(Saml2X509Credential.signing(readPrivateKey(), readCertificate()));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ })
+ .assertionConsumerServiceLocation(acsUrl)
+ .assertingPartyDetails(details -> details.entityId(ipdBaseUrl + "/gw/metadata")
+ .singleSignOnServiceLocation(ipdBaseUrl + "/gw/SSOProxy/SAML2")
+ .singleSignOnServiceBinding(Saml2MessageBinding.POST)
+ .wantAuthnRequestsSigned(true)
+ .verificationX509Credentials(credentials -> {
+ try {
+ // Load the IDP's public certificate for verifying the SAML response signature
+ credentials.add(Saml2X509Credential.verification(readIdpCertificate()));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ })
+ )
+ .build();
+
+ return new InMemoryRelyingPartyRegistrationRepository(registration);
+ }
+
+ public AuthnRequest createSignedAuthnRequest(PrivateKey privateKey, X509Certificate certificate) throws Exception {
+ AuthnRequest authnRequest = (AuthnRequest) XMLObjectProviderRegistrySupport.getBuilderFactory()
+ .getBuilder(AuthnRequest.DEFAULT_ELEMENT_NAME)
+ .buildObject(AuthnRequest.DEFAULT_ELEMENT_NAME);
+
+ authnRequest.setID("_" + UUID.randomUUID().toString());
+ authnRequest.setVersion(SAMLVersion.VERSION_20);
+ // authnRequest.setIssueInstant(new DateTime());
+ authnRequest.setIssueInstant(Instant.now());
+
+
+ // Sign the AuthnRequest
+ // BasicCredential signingCredential = new BasicCredential(certificate, privateKey);
+ BasicX509Credential signingCredential = new BasicX509Credential(certificate, privateKey);
+
+ Signature signature = (Signature) XMLObjectProviderRegistrySupport.getBuilderFactory()
+ .getBuilder(Signature.DEFAULT_ELEMENT_NAME)
+ .buildObject(Signature.DEFAULT_ELEMENT_NAME);
+
+ signature.setCanonicalizationAlgorithm(SignatureConstants.ALGO_ID_C14N_EXCL_OMIT_COMMENTS);
+ signature.setSigningCredential(signingCredential);
+ signature.setSignatureAlgorithm(SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA1); // Set RSA-SHA1
+
+ authnRequest.setSignature(signature);
+ DefaultSecurityConfigurationBootstrap.buildDefaultSignatureSigningConfiguration();
+
+ // Marshall and sign the object
+ XMLObjectProviderRegistrySupport.getMarshallerFactory().getMarshaller(authnRequest).marshall(authnRequest);
+ Signer.signObject(signature);
+
+ return authnRequest;
+ }
+
+@Bean
+public Saml2AuthenticationRequestResolver authenticationRequestResolver(RelyingPartyRegistrationRepository registrations) {
+ RelyingPartyRegistrationResolver registrationResolver = new DefaultRelyingPartyRegistrationResolver(registrations);
+ OpenSaml4AuthenticationRequestResolver authenticationRequestResolver = new OpenSaml4AuthenticationRequestResolver(registrationResolver);
+
+ authenticationRequestResolver.setAuthnRequestCustomizer((context) -> {
+ // Set the required attributes
+ AuthnRequest authnRequest = context.getAuthnRequest();
+ authnRequest.setID("_" + UUID.randomUUID().toString()); // Add a unique ID
+ authnRequest.setVersion(SAMLVersion.VERSION_20); // Ensure version is 2.0
+ authnRequest.setProtocolBinding(SAMLConstants.SAML2_POST_BINDING_URI); // HTTP-POST
+
+ // Set Authentication Context
+ authnRequest.setRequestedAuthnContext(buildRequestedAuthnContext());
+
+ // Log the SAML AuthnRequest after setting context
+ String samlRequest = SamlRequestLogger.convertSAMLObjectToString(authnRequest);
+ logger.info("SAML AuthnRequest after setting context: " + samlRequest);
+ });
+
+ return authenticationRequestResolver;
+}
+
+private RequestedAuthnContext buildRequestedAuthnContext() {
+ AuthnContextClassRefBuilder authnContextClassRefBuilder = new AuthnContextClassRefBuilder();
+ AuthnContextClassRef authnContextClassRef = authnContextClassRefBuilder.buildObject(
+ SAMLConstants.SAML20_NS, AuthnContextClassRef.DEFAULT_ELEMENT_LOCAL_NAME, SAMLConstants.SAML20_PREFIX
+ );
+ // Set the SPID Level 2 authentication context
+ authnContextClassRef.setURI("urn:oasis:names:tc:SAML:2.0:ac:classes:SecureRemotePassword");
+
+ RequestedAuthnContextBuilder requestedAuthnContextBuilder = new RequestedAuthnContextBuilder();
+ RequestedAuthnContext requestedAuthnContext = requestedAuthnContextBuilder.buildObject();
+ requestedAuthnContext.setComparison(AuthnContextComparisonTypeEnumeration.EXACT);
+ requestedAuthnContext.getAuthnContextClassRefs().add(authnContextClassRef);
+
+ return requestedAuthnContext;
+}
+
+ public PrivateKey readPrivateKey() throws Exception {
+ // Path to your private key PEM file
+ try (PemReader pemReader = new PemReader(new InputStreamReader(readKey(activeProfileFolder + "/saml/private-key.pem")))) {
+ // Read the PEM content
+ byte[] pemContent = pemReader.readPemObject().getContent();
+ // Decode the PEM content
+ PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(pemContent);
+ KeyFactory keyFactory = KeyFactory.getInstance("RSA"); // Use RSA algorithm
+ // Generate and return the PrivateKey
+ return keyFactory.generatePrivate(keySpec);
+ }
+ }
+ public X509Certificate readCertificate() throws Exception {
+ // Path to your certificate PEM fileFile
+ try (InputStream inStream = readKey(activeProfileFolder + "/saml/public-cert.pem")) {
+ CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
+ return (X509Certificate) certFactory.generateCertificate(inStream);
+ }
+ }
+
+ public X509Certificate readIdpCertificate() throws Exception {
+ // Path to your IDP public certificate PEM file
+ try (InputStream inStream = readKey(activeProfileFolder + "/saml/idp-certificate.pem")) {
+ CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
+ return (X509Certificate) certFactory.generateCertificate(inStream);
+ }
+ }
+
+
+ public InputStream readKey(String path) throws IOException {
+ ClassLoader classLoader = getClass().getClassLoader();
+ InputStream inputStream = classLoader.getResourceAsStream(path);
+
+ if (inputStream == null) {
+ throw new FileNotFoundException("file not found : "+path);
+ }
+ return inputStream;
+ }
+}
diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java
new file mode 100644
index 00000000..81df79e3
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java
@@ -0,0 +1,35 @@
+package net.gepafin.tendermanagement.config;
+
+import java.io.IOException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.authentication.AuthenticationFailureHandler;
+import org.springframework.stereotype.Component;
+
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
+@Component
+public class SamlFailureHandler implements AuthenticationFailureHandler {
+
+ private final Logger logger = LoggerFactory.getLogger(SamlSuccessHandler.class);
+
+ @Value("${fe.base.url}")
+ private String feBaseUrl;
+
+ @Override
+ public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
+ AuthenticationException exception) throws IOException {
+ try {
+ logger.error("SAML login failed: " + exception.getMessage());
+
+ response.sendRedirect(feBaseUrl + "/login");
+ } catch (Exception e) {
+ logger.error("Error processing SAML failure handler", e);
+ }
+ }
+
+}
diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlRequestLogger.java b/src/main/java/net/gepafin/tendermanagement/config/SamlRequestLogger.java
new file mode 100644
index 00000000..fd4d6561
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/config/SamlRequestLogger.java
@@ -0,0 +1,22 @@
+package net.gepafin.tendermanagement.config;
+
+import org.opensaml.core.xml.io.MarshallingException;
+import org.opensaml.core.xml.util.XMLObjectSupport;
+import org.opensaml.saml.saml2.core.AuthnRequest;
+import org.w3c.dom.Element;
+
+import net.shibboleth.utilities.java.support.xml.SerializeSupport;
+
+public class SamlRequestLogger {
+
+ public static String convertSAMLObjectToString(AuthnRequest authnRequest) {
+ try {
+ Element element = XMLObjectSupport.marshall(authnRequest);
+ return SerializeSupport.prettyPrintXML(element); // Pretty print XML using SerializeSupport
+ } catch (MarshallingException e) {
+ e.printStackTrace();
+ return "Error converting SAML object to XML";
+ }
+ }
+}
+
diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java
new file mode 100644
index 00000000..868b0eae
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java
@@ -0,0 +1,98 @@
+package net.gepafin.tendermanagement.config;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.saml2.provider.service.authentication.Saml2AuthenticatedPrincipal;
+import org.springframework.security.saml2.provider.service.authentication.Saml2Authentication;
+import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
+import org.springframework.stereotype.Component;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import net.gepafin.tendermanagement.constants.GepafinConstant;
+import net.gepafin.tendermanagement.entities.SamlResponseEntity;
+import net.gepafin.tendermanagement.entities.UserEntity;
+import net.gepafin.tendermanagement.repositories.SamlResponseRepository;
+import net.gepafin.tendermanagement.repositories.UserRepository;
+import net.gepafin.tendermanagement.util.Utils;
+import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
+import net.gepafin.tendermanagement.web.rest.api.errors.Status;
+
+@Component
+public class SamlSuccessHandler implements AuthenticationSuccessHandler {
+
+ private final Logger logger = LoggerFactory.getLogger(SamlSuccessHandler.class);
+
+ @Autowired
+ private SamlResponseRepository samlResponseLogRepository;
+
+ @Autowired
+ private UserRepository userRepository;
+
+ @Value("${fe.base.url}")
+ private String feBaseUrl;
+
+ @Override
+ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
+ Authentication authentication) throws IOException {
+ try {
+ logger.info("SAML login in Authentication Success Handler");
+ Saml2Authentication samlAuth = (Saml2Authentication) authentication;
+ Saml2AuthenticatedPrincipal principal = (Saml2AuthenticatedPrincipal) samlAuth.getPrincipal();
+
+ Map> userAttributes = principal.getAttributes();
+ String token = Utils.generateSecureToken();
+ logger.info("SAML User Attributes: " + userAttributes);
+
+ SamlResponseEntity samlResponseLogEntity = new SamlResponseEntity();
+ samlResponseLogEntity.setAuthenticationObject(authentication.toString());
+
+ ObjectMapper objectMapper = new ObjectMapper();
+ String userAttributesJson = objectMapper.writeValueAsString(userAttributes);
+ samlResponseLogEntity.setAuthenticationObject(userAttributesJson);
+ samlResponseLogEntity.setToken(token);
+ samlResponseLogRepository.save(samlResponseLogEntity);
+
+ String redirectUrl = feBaseUrl;
+
+ logger.info("SAML login successful for user: " + principal.getName());
+ String cf = userAttributes.get("CodiceFiscale").get(0).toString();
+ UserEntity userEntity = userRepository.findByBeneficiaryCodiceFiscale(cf).orElse(null);
+ if (userEntity == null) {
+ redirectUrl += "/registration?temp_token=" + token;
+ } else {
+ redirectUrl += "/login?temp_token=" + token;
+ }
+ response.sendRedirect(redirectUrl);
+ logger.info("SAML redirect Url: " + redirectUrl);
+ } catch (Exception e) {
+ logger.error("Error processing SAML success handler", e);
+ }
+ }
+
+ public void validateToken(String token, String codiceFiscale) {
+ SamlResponseEntity samlResponseLogEntity = samlResponseLogRepository.findByToken(token);
+ if (samlResponseLogEntity == null) {
+ throw new CustomValidationException(Status.VALIDATION_ERROR,
+ Translator.toLocale(GepafinConstant.INVALID_TOKEN_MSG));
+ }
+ Map> userAttributes = Utils
+ .convertStringIntoMap(samlResponseLogEntity.getAuthenticationObject());
+ String cf = userAttributes.get("CodiceFiscale").get(0).toString();
+ if (codiceFiscale == null || Boolean.FALSE.equals(codiceFiscale.equals(cf))) {
+ throw new CustomValidationException(Status.VALIDATION_ERROR,
+ Translator.toLocale(GepafinConstant.INVALID_TOKEN_MSG));
+ }
+ samlResponseLogRepository.delete(samlResponseLogEntity);
+ }
+
+}
diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java
index e06c3e4b..91424195 100644
--- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java
+++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java
@@ -1,6 +1,7 @@
package net.gepafin.tendermanagement.config;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
@@ -23,6 +24,7 @@ import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.handler.HandlerMappingIntrospector;
+
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.security.SecurityRequirement;
@@ -35,19 +37,25 @@ import net.gepafin.tendermanagement.config.jwt.TokenProvider;
@EnableWebSecurity
@EnableMethodSecurity(prePostEnabled = true)
public class SecurityConfig {
-
private final TokenProvider tokenProvider;
-
+ private final SamlSuccessHandler samlSuccessHandler;
+ private final SamlFailureHandler samlFailureHandler;
+
+ @Value("${base-url}")
+ String baseUrl;
+
@Autowired
- public SecurityConfig(TokenProvider tokenProvider) {
+ public SecurityConfig(TokenProvider tokenProvider, SamlSuccessHandler samlSuccessHandler, SamlFailureHandler samlFailureHandler) {
this.tokenProvider = tokenProvider;
+ this.samlSuccessHandler =samlSuccessHandler;
+ this.samlFailureHandler=samlFailureHandler;
}
+
@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception {
return config.getAuthenticationManager();
}
-
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
@@ -75,8 +83,8 @@ public class SecurityConfig {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("*");
- config.addAllowedMethod("*");
- config.addAllowedHeader("*");
+ config.addAllowedMethod("*");
+ config.addAllowedHeader("*");
config.setMaxAge(3600l);
if (config.getAllowedOrigins() != null && !config.getAllowedOrigins().isEmpty()) {
@@ -86,23 +94,30 @@ public class SecurityConfig {
}
return new CorsFilter(source);
}
-
-
@Bean
- public SecurityFilterChain securityFilterChain(HttpSecurity http, MvcRequestMatcher.Builder mvc) throws Exception {
- http
- .csrf(AbstractHttpConfigurer::disable)
- .authorizeHttpRequests(auth -> auth
- .requestMatchers(mvc.pattern(HttpMethod.POST, "/v1/user/login")).permitAll()
- .requestMatchers("/swagger-ui/**").permitAll()
- .requestMatchers("/v1/api-docs/**").permitAll()
- .anyRequest().authenticated()
- )
- .sessionManagement(session -> session
- .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
- )
+ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
+ http.csrf(AbstractHttpConfigurer::disable).authorizeHttpRequests(auth -> auth
+ // Allow public access to the login endpoints
+ .requestMatchers("/v1/user/login").permitAll() // JWT-based login
+ .requestMatchers("/v1/user").permitAll() // User registration
+ .requestMatchers("/v1/user/sso/validate/existing-user/{token}").permitAll()
+ .requestMatchers("/v1/user/sso/validate/new-user/{token}").permitAll()
+ .requestMatchers("/v1/saml/**").permitAll() // JWT-based login
+ .requestMatchers("/saml2/**").permitAll() // SAML login initiation
+ .requestMatchers("/swagger-ui/**").permitAll() // Swagger docs
+ .requestMatchers("/v1/api-docs/**").permitAll() // API docs
+ .anyRequest().authenticated())
+ .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.addFilterBefore(corsFilter(), UsernamePasswordAuthenticationFilter.class)
- .addFilterBefore(new JWTFilter(tokenProvider), UsernamePasswordAuthenticationFilter.class);
+ .addFilterBefore(new JWTFilter(tokenProvider), UsernamePasswordAuthenticationFilter.class)
+ // Add SAML2 login configuration (for BENEFICIARI)
+ /*
+ * .saml2Login(saml -> saml.loginPage("/saml/login") // Entry point for SAML
+ * login .defaultSuccessUrl("/") // Redirect after successful SAML login );
+ */
+ .saml2Login(saml -> saml.defaultSuccessUrl("/").successHandler(samlSuccessHandler)
+ .failureHandler(samlFailureHandler));
+
return http.build();
}
@@ -116,4 +131,6 @@ public class SecurityConfig {
new SecurityScheme().type(SecurityScheme.Type.HTTP)
.scheme("bearer").bearerFormat("JWT")));
}
-}
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java b/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java
index 15c51b7a..d299b6ff 100644
--- a/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java
+++ b/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java
@@ -82,10 +82,11 @@ public class TokenProvider {
log.info("JWT Secret Key initialized.");
}
- public String createToken(Authentication authentication, Boolean rememberMe, UserEntity user) {
- String authorities = authentication.getAuthorities().stream()
- .map(GrantedAuthority::getAuthority)
- .collect(Collectors.joining(","));
+ public String createToken(Boolean rememberMe, UserEntity user) {
+// String authorities = authentication.getAuthorities().stream()
+// .map(GrantedAuthority::getAuthority)
+// .collect(Collectors.joining(","));
+ String authorities = user.getRoleEntity().getRoleType();
Long now;
Date validity;
@@ -99,7 +100,7 @@ public class TokenProvider {
log.info("Creating token with standard validity of {} seconds.", this.tokenValidityInSeconds);
}
- String payload = authentication.getName();
+ String payload = user.getEmail();
if(user != null) {
payload += ":"+user.getId();
}
diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java
index 395d883c..3ebf7e5f 100644
--- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java
+++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java
@@ -136,7 +136,6 @@ public class GepafinConstant {
public static final String APPLICATION_IS_INCOMPLETE_MSG = "application.is.incomplete";
public static final String AUTHORIZATION = "Authorization";
public static final String CHECK_VATNUMBER_V2_NEW_URL = "https://imprese.openapi.it/advance";
- public static final String VATNUMBER_V2 = "https://imprese.openapi.it/advance";
public static final String VALIDATION_FIELD_CUSTOM="validation.field.custom";
public static final String VALIDATION_CODICE_FISCALE = "validation.codice.fiscale";
public static final String VALIDATION_CAP = "validation.cap";
@@ -155,6 +154,29 @@ public class GepafinConstant {
public static final String IS_CAP="isCAP";
public static final String IS_CODICE_FISCALE="isCodiceFiscale";
public static final String IS_PIVA="isPIVA";
-
public static final String FAILED_RETAIN_FIELD="failed.retain.field";
+ public static final String USER_ALREADY_EXIST_MSG = "user.already.exist.msg";
+ public static final String TOKEN_VALIDATE_SUCCESS_MSE = "token.validate.success";
+ public static final String INVALID_REQUEST = "invalid.request";
+ public static final String CODICE_FISCALE_EXISTS = "codice.fiscale.exists";
+ public static final String TOTAL_STEPS_NOT_BE_ZERO="total.steps.not.zero";
+ public static final String COMPLETED_STEPS_NOT_VALID="completed.steps.not.valid";
+ public static final String FIELD_ID_NOT_FOUND="field.id.not.found";
+ public static final String VALIDATE_EMAIL = "validate.email";
+ public static final String ROLE_ID_MANDATORY = "role.id.mandatory";
+ public static final String VALIDATE_PASSWORD = "validate.password";
+
+ public static final String COMPANY_CREATED_SUCCESS_MSG = "company.created.success";
+ public static final String COMPANY_UPDATED_SUCCESS_MSG = "company.updated.success";
+ public static final String COMPANY_DELETE_SUCCESS_MSG = "company.delete.success";
+ public static final String COMPANY_GET_SUCCESS_MSG = "company.get.success";
+ public static final String COMPANY_NOT_FOUND_MSG = "company.not.found";
+ public static final String CHECK_VATNUMBER_SUCCESS_MSG = "check.vatnumber.success";
+ public static final String INVALID_VATNUMBER = "invalid.vatnumber";
+ public static final String VATNUMBER_MANDATORY = "vatnumber.mandatory";
+ public static final String VATNUMBER_ALREADY_EXISTS = "vatnumber.already.exists";
+ public static final String INVALID_EMAIL = "invalid.email";
+ public static final String UNAUTHORIZED = "UNAUTHORIZED";
+ public static final String COMPANY_ID_MANDATORY = "company.id.mandatory";
+ public static final String USER_ALREADY_CONNECTED_TO_COMPANY = "user.already.connected.to.company";
}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java
index f8e86e7e..a76b9de3 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java
@@ -4,26 +4,32 @@ import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.*;
import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum;
+import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum;
import net.gepafin.tendermanagement.enums.RoleStatusEnum;
import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean;
import net.gepafin.tendermanagement.model.request.ApplicationRequest;
import net.gepafin.tendermanagement.model.request.ApplicationRequestBean;
import net.gepafin.tendermanagement.model.response.*;
-import net.gepafin.tendermanagement.repositories.ApplicationFormFieldRepository;
-import net.gepafin.tendermanagement.repositories.ApplicationFormRepository;
-import net.gepafin.tendermanagement.repositories.ApplicationRepository;
+import net.gepafin.tendermanagement.repositories.*;
import net.gepafin.tendermanagement.service.CallService;
+import net.gepafin.tendermanagement.service.DocumentService;
import net.gepafin.tendermanagement.service.FormService;
import net.gepafin.tendermanagement.util.DateTimeUtil;
+import net.gepafin.tendermanagement.util.FieldValidator;
import net.gepafin.tendermanagement.util.Utils;
+import net.gepafin.tendermanagement.util.Validator;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException;
import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Component;
+import jakarta.persistence.criteria.Predicate;
+
+import java.text.MessageFormat;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@@ -48,16 +54,36 @@ public class ApplicationDao {
@Autowired
private FormService formService;
- public ApplicationResponseBean createApplication(ApplicationRequestBean applicationRequestBean, UserEntity userEntity, Long formId,Long applicationId) {
+ @Autowired
+ private DocumentService documentService;
+
+ @Autowired
+ private CallDao callDao;
+
+ @Autowired
+ private FlowFormDao flowFormDao;
+
+ @Autowired
+ private FlowEdgesRepository flowEdgesRepository;
+
+ @Autowired
+ private FlowDataRepository flowDataRepository;
+
+ @Autowired
+ private Validator validator;
+
+
+ public ApplicationResponseBean createApplication(ApplicationRequestBean applicationRequestBean, UserEntity userEntity, Long formId, Long applicationId) {
FormEntity formEntity = formService.validateForm(formId);
- CallEntity call = callService.validatePublishedCall(formEntity.getCall().getId());
+ callService.validatePublishedCall(formEntity.getCall().getId());
+ validateFormFields(applicationRequestBean,formEntity);
ApplicationEntity applicationEntity = validateApplication(applicationId);
- if(Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.SUBMIT.getValue()))){
+ if(Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.SUBMIT.getValue()))) {
throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_SUBMITTED));
}
formService.validateFormField(applicationRequestBean.getFormFields(),applicationEntity,formEntity);
ApplicationFormEntity applicationFormEntity = getApplicationFormOrCreate(formEntity, applicationEntity);
- createOrUpdateMultipleFormFields(applicationRequestBean.getFormFields(), applicationFormEntity);
+ createOrUpdateMultipleFormFields(applicationRequestBean.getFormFields(), applicationFormEntity,formEntity);
return getApplicationById(applicationEntity.getId(),formEntity.getId());
}
@@ -66,12 +92,6 @@ public class ApplicationDao {
return applicationFormEntity1;
}
- public void validateFormId(FormEntity formEntity, CallEntity callEntity) {
- if (Boolean.FALSE.equals(formEntity.getId().equals(callEntity.getInitialForm()))) {
- throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.FORM_ID_DOES_NOT_MACTHES));
- }
- }
-
public ApplicationFormEntity createApplicationFormEntity(ApplicationEntity application, FormEntity formEntity) {
ApplicationFormEntity applicationFormEntity = new ApplicationFormEntity();
applicationFormEntity.setApplication(application);
@@ -80,9 +100,10 @@ public class ApplicationDao {
return applicationFormEntity;
}
- public ApplicationEntity createApplicationEntity(UserEntity user, CallEntity call) {
+ public ApplicationEntity createApplicationEntity(UserEntity user, CallEntity call, CompanyEntity companyEntity) {
ApplicationEntity entity = new ApplicationEntity();
- entity.setUser(user);
+ entity.setUserId(user.getId());
+ entity.setCompany(companyEntity);
entity.setCall(call);
entity.setIsDeleted(false);
entity.setStatus(ApplicationStatusTypeEnum.DRAFT.getValue());
@@ -95,17 +116,57 @@ public class ApplicationDao {
ApplicationEntity applicationEntity = validateApplication(id);
ApplicationFormEntity applicationFormEntity = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(),formId);
List applicationFormFieldResponseBeans=new ArrayList<>();
- ApplicationFormFieldResponseBean applicationFormFieldResponseBeans1=null;
List applicationFormFieldEntities = applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId());
- for(ApplicationFormFieldEntity applicationFormFieldEntity:applicationFormFieldEntities) {
- applicationFormFieldResponseBeans1 = convertApplicationFormFieldEntityToApplicationFormFieldResponseBean(applicationFormFieldEntity, applicationFormEntity.getId());
- applicationFormFieldResponseBeans.add(applicationFormFieldResponseBeans1);
- }
+ applicationFormFieldResponseBeans=createApplicationFormFieldResponse(applicationFormFieldEntities, applicationFormEntity, applicationFormFieldResponseBeans);
ApplicationResponseBean applicationResponseBean= convertApplicationEntityToApplicationResponseBean(applicationEntity);
applicationResponseBean.setFormFields(applicationFormFieldResponseBeans);
return applicationResponseBean;
}
+ private List createApplicationFormFieldResponse(
+ List applicationFormFieldEntities,
+ ApplicationFormEntity applicationFormEntity,
+ List applicationFormFieldResponseBeans) {
+
+ List contentResponseBeans = Utils.convertJsonStringToList(
+ applicationFormEntity.getForm().getContent(), ContentResponseBean.class);
+
+ for (ApplicationFormFieldEntity applicationFormFieldEntity : applicationFormFieldEntities) {
+
+ Optional fileUploadContent = contentResponseBeans.stream()
+ .filter(contentResponseBean -> "fileupload".equals(contentResponseBean.getName()) &&
+ contentResponseBean.getId().equals(applicationFormFieldEntity.getFieldId()))
+ .findFirst();
+
+ List documentResponseBeans = new ArrayList<>();
+ if (fileUploadContent.isPresent()) {
+ String documentId = applicationFormFieldEntity.getFieldValue();
+ if (documentId != null && !documentId.isEmpty()) {
+ documentResponseBeans = Arrays.stream(documentId.split(","))
+ .map(String::trim)
+ .map(Long::parseLong)
+ .map(docId -> {
+ DocumentEntity documentEntity = documentService.validateDocument(docId);
+ if (Boolean.FALSE.equals(DocumentSourceTypeEnum.APPLICATION.getValue().equals(documentEntity.getSource()))) {
+ throw new CustomValidationException(Status.NOT_FOUND,Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND));
+ }
+ return documentEntity;
+ })
+ .map(callDao::convertToDocumentResponseBean)
+ .collect(Collectors.toList());
+ }
+ }
+ ApplicationFormFieldResponseBean responseBean = convertApplicationFormFieldEntityToApplicationFormFieldResponseBean(
+ applicationFormFieldEntity, applicationFormEntity.getId());
+ if (!documentResponseBeans.isEmpty()) {
+ responseBean.setFieldValue(documentResponseBeans);
+ }
+ applicationFormFieldResponseBeans.add(responseBean);
+ }
+
+ return applicationFormFieldResponseBeans;
+ }
+
public void deleteById(Long id) {
log.info("Deleting application with ID: {}", id);
@@ -115,58 +176,99 @@ public class ApplicationDao {
log.info("Application deleted with ID: {}", id);
}
- public List getAllApplications(UserEntity userEntity, Long callId) {
- RoleStatusEnum roleStatus = RoleStatusEnum.valueOf(userEntity.getRoleEntity().getRoleType());
- boolean isBeneficiary = RoleStatusEnum.ROLE_BENEFICIARY.equals(roleStatus);
-
- log.info("Fetching applications for RoleType: {}", roleStatus);
- List applicationResponses = new ArrayList<>();
+// public List getAllApplications(UserEntity userEntity, Long callId, CompanyEntity companyEntity) {
+// boolean isBeneficiary = validator.checkIsBeneficiary();
+//
+// log.info("Fetching applications for RoleType: {}", userEntity.getRoleEntity().getRoleType());
+// List applicationResponses = new ArrayList<>();
+//
+// if (callId != null) {
+// // Fetch based on callId and user if role is BENEFICIARY, otherwise fetch all for the call
+// log.info("Fetching applications for callId: {}", callId);
+// CallEntity call = callService.validateCall(callId);
+//
+// // Use a single method to handle both conditions for consistency
+// List applicationEntities = isBeneficiary
+// ? applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(), call.getId())
+// .map(List::of) // Convert Optional to a List of one element
+// .orElse(List.of()) // If not present, return an empty list
+// : applicationRepository.findByCallIdAndIsDeletedFalse(call.getId());
+//
+// applicationResponses = applicationEntities.stream()
+// .map(this::getApplicationResponse)
+// .collect(Collectors.toList());
+//
+// } else {
+// // Fetch all applications for the user if BENEFICIARY, or fetch all applications in general
+// List applicationEntities = isBeneficiary
+// ? applicationRepository.findByUserIdAndIsDeletedFalse(companyEntity.getId())
+// : applicationRepository.findByIsDeletedFalse();
+//
+// applicationResponses = applicationEntities.stream()
+// .map(this::getApplicationResponse)
+// .collect(Collectors.toList());
+// }
+//
+// return applicationResponses;
+// }
+
+ public List getAllApplications(UserEntity userEntity, Long callId, Long companyId) {
+
+ log.info("Fetching applications for RoleType: {}", userEntity.getRoleEntity().getRoleType());
- if (callId != null) {
- // Fetch based on callId and user if role is BENEFICIARY, otherwise fetch all for the call
- log.info("Fetching applications for callId: {}", callId);
- CallEntity call = callService.validateCall(callId);
+ Specification spec = search(userEntity.getId(), callId, companyId);
- // Use a single method to handle both conditions for consistency
- List applicationEntities = isBeneficiary
- ? applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(), call.getId())
- .map(List::of) // Convert Optional to a List of one element
- .orElse(List.of()) // If not present, return an empty list
- : applicationRepository.findByCallIdAndIsDeletedFalse(call.getId());
+ List applicationEntities = applicationRepository.findAll(spec);
- applicationResponses = applicationEntities.stream()
- .map(this::getApplicationResponse)
- .collect(Collectors.toList());
-
- } else {
- // Fetch all applications for the user if BENEFICIARY, or fetch all applications in general
- List applicationEntities = isBeneficiary
- ? applicationRepository.findByUserIdAndIsDeletedFalse(userEntity.getId())
- : applicationRepository.findByIsDeletedFalse();
-
- applicationResponses = applicationEntities.stream()
- .map(this::getApplicationResponse)
- .collect(Collectors.toList());
- }
-
- return applicationResponses;
+ return applicationEntities.stream()
+ .map(this::getApplicationResponse)
+ .collect(Collectors.toList());
}
- private ApplicationResponse getApplicationResponse(ApplicationEntity applicationEntity) {
+ private Specification search(Long userId, Long callId, Long companyId) {
+ return (root, query, builder) -> {
+ Boolean isBeneficiary = validator.checkIsBeneficiary();
+ Predicate predicate = builder.isFalse(root.get("isDeleted"));
+ if (isBeneficiary) {
+ predicate = builder.and(predicate, builder.equal(root.get("userId"), userId));
+ }
+ if (callId != null) {
+ predicate = builder.and(predicate, builder.equal(root.get("call").get("id"), callId));
+ }
+ if (companyId != null) {
+ predicate = builder.and(predicate, builder.equal(root.get("company").get("id"), companyId));
+ }
+ return predicate;
+ };
+ }
+
+ private ApplicationResponse getApplicationResponse(ApplicationEntity applicationEntity) {
ApplicationResponse responseBean = new ApplicationResponse();
+ List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId());
+ Long totalFormSteps = flowFormDao.calculateTotalSteps(flowEdgesList);
+ Long completedSteps= Long.valueOf(flowFormDao.getCompletedSteps(applicationEntity));
+ Integer progress=calculateProgress(totalFormSteps,completedSteps);
responseBean.setId(applicationEntity.getId());
+ responseBean.setProgress(progress);
+ responseBean.setCallTitle(applicationEntity.getCall().getName());
+ responseBean.setCallEndDate(applicationEntity.getCall().getEndDate());
+ responseBean.setModifiedDate(applicationEntity.getCall().getUpdatedDate());
responseBean.setCallId(applicationEntity.getCall().getId());
responseBean.setSubmissionDate(applicationEntity.getSubmissionDate());
responseBean.setStatus(applicationEntity.getStatus());
responseBean.setComments(applicationEntity.getComments());
+ responseBean.setCompanyId(applicationEntity.getCompany().getId());
+ responseBean.setCompanyName(applicationEntity.getCompany().getCompanyName());
return responseBean;
}
- public ApplicationEntity validateApplication(Long id) {
- ApplicationEntity applicationEntity= applicationRepository.findById(id).orElseThrow(() ->new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.APPLICATION_NOT_FOUND_MSG)));
- return applicationEntity;
- }
+ public ApplicationEntity validateApplication(Long id) {
+ ApplicationEntity applicationEntity = applicationRepository.findById(id)
+ .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
+ Translator.toLocale(GepafinConstant.APPLICATION_NOT_FOUND_MSG)));
+ return applicationEntity;
+ }
private ApplicationResponseBean convertApplicationEntityToApplicationResponseBean(ApplicationEntity entity) {
ApplicationResponseBean response = new ApplicationResponseBean();
@@ -188,18 +290,21 @@ public class ApplicationDao {
return applicationFormEntity;
}
- public List createOrUpdateMultipleFormFields(List formFieldResponseBeans, ApplicationFormEntity applicationFormEntity) {
+ public List createOrUpdateMultipleFormFields(List formFieldResponseBeans, ApplicationFormEntity applicationFormEntity,FormEntity formEntity) {
List existingFields = applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId());
List applicationFormFieldEntity = formFieldResponseBeans.stream()
- .map(requestBean -> createOrUpdateApplicationFormField(requestBean, applicationFormEntity,existingFields))
+ .map(requestBean -> createOrUpdateApplicationFormField(requestBean, applicationFormEntity,existingFields,formEntity))
.collect(Collectors.toList());
return applicationFormFieldEntity;
}
- public ApplicationFormFieldEntity createOrUpdateApplicationFormField(ApplicationFormFieldRequestBean applicationFormFieldRequestBean, ApplicationFormEntity applicationFormEntity,List applicationFormFieldEntities ) {
+ public ApplicationFormFieldEntity createOrUpdateApplicationFormField(ApplicationFormFieldRequestBean applicationFormFieldRequestBean, ApplicationFormEntity applicationFormEntity,List applicationFormFieldEntities ,FormEntity formEntity) {
ApplicationFormFieldEntity applicationFormFieldEntity=null;
+
+ validateFileUploadDocuments(applicationFormFieldRequestBean, formEntity);
+
if(applicationFormFieldEntities==null || applicationFormFieldEntities.isEmpty()){
applicationFormFieldEntity = new ApplicationFormFieldEntity();
applicationFormFieldEntity.setApplicationForm(applicationFormEntity);
@@ -207,6 +312,9 @@ public class ApplicationDao {
for (ApplicationFormFieldEntity applicationFormFieldEntity1 : applicationFormFieldEntities) {
if (applicationFormFieldEntity1.getFieldId().equals(applicationFormFieldRequestBean.getFieldId())) {
applicationFormFieldEntity = applicationFormFieldEntity1;
+ if(applicationFormEntity.getForm().getId().equals(applicationFormEntity.getApplication().getCall().getInitialForm())){
+ validateRequiredFields(applicationFormEntity.getForm(),applicationFormEntity.getApplication(), applicationFormFieldRequestBean.getFieldId());
+ }
break;
} else {
applicationFormFieldEntity = new ApplicationFormFieldEntity();
@@ -215,10 +323,37 @@ public class ApplicationDao {
}
}
Utils.setIfUpdated(applicationFormFieldEntity::getFieldId, applicationFormFieldEntity::setFieldId, applicationFormFieldRequestBean.getFieldId());
- Utils.setIfUpdated(applicationFormFieldEntity::getFieldValue, applicationFormFieldEntity::setFieldValue, applicationFormFieldRequestBean.getFieldValue());
+ if(applicationFormFieldRequestBean.getFieldValue() ==null || Boolean.FALSE.equals(applicationFormFieldRequestBean.getFieldValue().isEmpty())) {
+ applicationFormFieldEntity.setFieldValue(applicationFormFieldRequestBean.getFieldValue());
+ }
return applicationFormFieldRepository.save(applicationFormFieldEntity);
}
+ private List validateFileUploadDocuments(ApplicationFormFieldRequestBean applicationFormFieldRequestBean, FormEntity formEntity) {
+ List documentIds=null;
+ List contentResponseBeans=Utils.convertJsonStringToList(formEntity.getContent(),ContentResponseBean.class);
+ for (ContentResponseBean contentResponseBean:contentResponseBeans){
+ if(Boolean.TRUE.equals(contentResponseBean.getName().equals("fileupload"))){
+ if(contentResponseBean.getId().equals(applicationFormFieldRequestBean.getFieldId())) {
+ String documentId = applicationFormFieldRequestBean.getFieldValue();
+ documentIds = validateDocumentIds(documentId);
+ }
+ }
+ }
+ return documentIds;
+ }
+
+ private List validateDocumentIds(String documentId) {
+ if (documentId != null && !documentId.isEmpty()) {
+ return Arrays.stream(documentId.split(","))
+ .map(Long::parseLong)
+ .peek(docId -> documentService.validateDocument(docId))
+ .collect(Collectors.toList());
+ }
+ return Collections.emptyList();
+ }
+
+
public ApplicationFormFieldEntity validateApplicationFormField(Long applicationFormFieldId) {
Optional applicationFormFieldEntity = applicationFormFieldRepository.findById(applicationFormFieldId);
if (applicationFormFieldEntity.isEmpty()) {
@@ -253,15 +388,19 @@ public class ApplicationDao {
return applicationEntity;
}
- public ApplicationGetResponseBean getApplicationByFormId( Long applicationId,Long formId, UserEntity userEntity) {
+ public ApplicationGetResponseBean getApplicationByFormId( Long applicationId, Long formId, UserEntity userEntity) {
List formApplicationResponses = new ArrayList<>();
List formEntities = new ArrayList<>();
- ApplicationEntity applicationEntity = applicationRepository.findById(applicationId)
+ boolean isBeneficiary = isBeneficiary(userEntity);
+ ApplicationEntity applicationEntity = isBeneficiary
+ ? applicationRepository.findByIdAndUserIdAndIsDeletedFalse(applicationId, userEntity.getId())
+ .orElseThrow(() -> new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_NOT_FOUND_MSG)))
+ : applicationRepository.findById(applicationId)
+ .stream().findFirst()
.orElseThrow(() -> new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_NOT_FOUND_MSG)));
-
if (formId != null) {
FormEntity formEntity = formService.validateForm(formId);
- Optional application = applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(),
+ Optional application = applicationRepository.findByIdAndUserIdAndCallIdAndIsDeletedFalse(applicationId, userEntity.getId(),
formEntity.getCall().getId());
applicationEntity=application.get();
formEntities.add(formEntity);
@@ -279,6 +418,12 @@ public class ApplicationDao {
return createApplicationGetResponseBean(applicationEntity, formEntities, formApplicationResponses);
}
+ private boolean isBeneficiary(UserEntity userEntity) {
+ RoleStatusEnum roleStatus = RoleStatusEnum.valueOf(userEntity.getRoleEntity().getRoleType());
+ boolean isBeneficiary = RoleStatusEnum.ROLE_BENEFICIARY.equals(roleStatus);
+ return isBeneficiary;
+ }
+
private void addFormApplication(FormEntity formEntity, ApplicationEntity applicationEntity,
List formApplicationResponses) {
FormApplicationResponse formApplicationResponse = processForm(formEntity, applicationEntity);
@@ -290,12 +435,12 @@ public class ApplicationDao {
public FormApplicationResponse processForm(FormEntity formEntity, ApplicationEntity applicationEntity) {
FormApplicationResponse formApplicationResponse = createFormApplicationResponse(formEntity);
+ List applicationFormFieldResponseBeans =new ArrayList<>();
ApplicationFormEntity applicationFormEntity = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), formEntity.getId());
if(applicationFormEntity!=null) {
List applicationFormFieldEntities = applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId());
// formApplicationResponse = createFormApplicationResponse(formEntity);
- List applicationFormFieldResponseBeans = convertApplicationFormFieldEntitiesToApplicationFormFieldResponseBeans(applicationFormFieldEntities, applicationFormEntity.getId());
-
+ applicationFormFieldResponseBeans = createApplicationFormFieldResponse(applicationFormFieldEntities, applicationFormEntity,applicationFormFieldResponseBeans);
formApplicationResponse.setFormFields(applicationFormFieldResponseBeans);
}
return formApplicationResponse;
@@ -315,6 +460,8 @@ public class ApplicationDao {
applicationGetResponseBean.setSubmissionDate(applicationEntity.getSubmissionDate());
applicationGetResponseBean.setCallId(applicationEntity.getCall().getId());
applicationGetResponseBean.setCallTitle(applicationEntity.getCall().getName());
+ applicationGetResponseBean.setCompanyId(applicationEntity.getCompany().getId());
+ applicationGetResponseBean.setCompanyName(applicationEntity.getCompany().getCompanyName());
return applicationGetResponseBean;
}
@@ -327,44 +474,43 @@ public class ApplicationDao {
return formApplicationResponse;
}
- public ApplicationResponse createApplicationByCallId(ApplicationRequest applicationRequest,Long callId,UserEntity userEntity){
- CallEntity call=callService.validateCall(callId);
- call = callService.validatePublishedCall(call.getId());
- checkIfApplicationExists(call,userEntity);
- ApplicationEntity applicationEntity=createApplicationEntity(userEntity,call);
- applicationEntity.setComments(applicationRequest.getComments());
- applicationEntity=saveApplicationEntity(applicationEntity);
- ApplicationResponse applicationResponse=getApplicationResponse(applicationEntity);
- return applicationResponse;
- }
- public void checkIfApplicationExists(CallEntity call,UserEntity userEntity){
- Optional applicationEntity=applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(),call.getId());
+ public ApplicationResponse createApplicationByCallId(CompanyEntity companyEntity,
+ ApplicationRequest applicationRequest, Long callId, UserEntity userEntity) {
+ CallEntity call = callService.validateCall(callId);
+ call = callService.validatePublishedCall(call.getId());
+ checkIfApplicationExists(call, companyEntity);
+ ApplicationEntity applicationEntity = createApplicationEntity(userEntity, call, companyEntity);
+ applicationEntity.setComments(applicationRequest.getComments());
+ applicationEntity = saveApplicationEntity(applicationEntity);
+ ApplicationResponse applicationResponse = getApplicationResponse(applicationEntity);
+ return applicationResponse;
+ }
+ public void checkIfApplicationExists(CallEntity call, CompanyEntity companyEntity){
+ Optional applicationEntity=applicationRepository.findByCompanyIdAndCallIdAndIsDeletedFalse(companyEntity.getId(),call.getId());
if(applicationEntity.isPresent()){
throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_EXISTS));
}
}
-
-
- public ApplicationEntity getApplicationByCallAndUser(CallEntity call, UserEntity userEntity) {
- return applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(), call.getId())
- .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
- Translator.toLocale(GepafinConstant.APPLICATION_NOT_FOUND_MSG)));
-
- }
public void updateApplicationStatus(Long applicationId, ApplicationStatusTypeEnum status) {
ApplicationEntity applicationEntity = validateApplication(applicationId);
if (status.equals(ApplicationStatusTypeEnum.SUBMIT)) {
- CallEntity callEntity = applicationEntity.getCall();
- Long initialFormId = callEntity.getInitialForm();
- Long finalFormId = callEntity.getFinalForm();
-// if (initialFormId == null || finalFormId == null) {
+// CallEntity callEntity = applicationEntity.getCall();
+// Long initialFormId = callEntity.getInitialForm();
+// Long finalFormId = callEntity.getFinalForm();
+//// if (initialFormId == null || finalFormId == null) {
+//// throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_IS_INCOMPLETE_MSG));
+//// }
+// ApplicationFormEntity initialApplicationForm = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), initialFormId);
+// ApplicationFormEntity finalApplicationForm = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), finalFormId);
+// if (initialApplicationForm == null || finalApplicationForm == null) {
// throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_IS_INCOMPLETE_MSG));
// }
- ApplicationFormEntity initialApplicationForm = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), initialFormId);
- ApplicationFormEntity finalApplicationForm = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), finalFormId);
- if (initialApplicationForm == null || finalApplicationForm == null) {
+ List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId());
+ Long totalSteps=flowFormDao.calculateTotalSteps(flowEdgesList);
+ Integer completedSteps=flowFormDao.getCompletedSteps(applicationEntity);
+ if (totalSteps.intValue() != completedSteps) {
throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_IS_INCOMPLETE_MSG));
}
applicationEntity.setStatus(ApplicationStatusTypeEnum.SUBMIT.getValue());
@@ -374,4 +520,78 @@ public class ApplicationDao {
}
saveApplicationEntity(applicationEntity);
}
+
+ public Integer calculateProgress(Long totalSteps, Long completedSteps) {
+ if (FieldValidator.isNullOrZero(totalSteps)) {
+ throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.TOTAL_STEPS_NOT_BE_ZERO));
+ }
+
+ if (completedSteps < 0 || completedSteps > totalSteps) {
+ throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.COMPLETED_STEPS_NOT_VALID));
+ }
+
+ double progress = ((double) completedSteps / totalSteps) * 100;
+ return (int) Math.round(progress);
+ }
+ public void validateFormFields(ApplicationRequestBean request, FormEntity formEntity) {
+
+ List contentResponseBeans=Utils.convertJsonStringToList(formEntity.getContent(),ContentResponseBean.class);
+
+ List requestFields = request.getFormFields();
+
+ Map contentMap = contentResponseBeans.stream()
+ .collect(Collectors.toMap(ContentResponseBean::getId, ContentResponseBean::getLabel)); // Change getLabel() if needed
+ FieldValidator validator = FieldValidator.create();
+ for (ApplicationFormFieldRequestBean requestField : requestFields) {
+ String fieldId = requestField.getFieldId();
+
+ if (!contentMap.containsKey(fieldId)) {
+ validator.addError(MessageFormat.format(Translator.toLocale(GepafinConstant.FIELD_ID_NOT_FOUND), fieldId));
+ }
+
+ }
+ validator.validate();
+ }
+
+ public void validateRequiredFields(FormEntity formEntity, ApplicationEntity applicationEntity, String fieldId) {
+ FlowDataEntity flowDataEntity = flowDataRepository.findByFormIdAndCallId(
+ formEntity.getId(), applicationEntity.getCall().getId());
+
+ if (flowDataEntity == null) {
+ return;
+ }
+
+ ApplicationFormFieldEntity applicationFormFieldEntity = applicationFormFieldRepository
+ .findByFieldIdAndApplicationFormFormIdAndApplicationFormApplicationId(
+ flowDataEntity.getChoosenField(), formEntity.getId(), applicationEntity.getId())
+ .orElse(null);
+
+ if (applicationFormFieldEntity == null || !fieldId.equals(applicationFormFieldEntity.getFieldId())) {
+ return;
+ }
+ List nextFormIds = flowEdgesRepository.findBySourceIdAndCallId(
+ formEntity.getId(), applicationEntity.getCall().getId())
+ .stream()
+ .map(FlowEdgesEntity::getTargetId)
+ .collect(Collectors.toList());
+
+ Optional nextFormIdOptional = flowDataRepository.findByChoosenValueAndFormIdIn(
+ applicationFormFieldEntity.getFieldValue(), nextFormIds)
+ .map(FlowDataEntity::getFormId);
+
+ if (nextFormIdOptional.isPresent()) {
+ Long nextFormId = nextFormIdOptional.get();
+
+ FormEntity nextForm = formService.validateForm(nextFormId);
+ ApplicationFormEntity nextApplicationFormEntity = applicationFormRepository.findByApplicationIdAndFormId(
+ applicationEntity.getId(), nextForm.getId());
+
+ if (nextApplicationFormEntity != null) {
+ List nextApplicationFormFieldEntities = applicationFormFieldRepository.findByApplicationFormId(nextApplicationFormEntity.getId());
+ applicationFormFieldRepository.deleteAll(nextApplicationFormFieldEntities);
+ applicationFormRepository.delete(nextApplicationFormEntity);
+ }
+ }
+ }
+
}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java
index 1b3f60d0..e214e562 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java
@@ -1,5 +1,6 @@
package net.gepafin.tendermanagement.dao;
+import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
@@ -10,6 +11,7 @@ import java.util.stream.Collectors;
import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum;
import net.gepafin.tendermanagement.model.response.*;
import net.gepafin.tendermanagement.service.*;
+import net.gepafin.tendermanagement.util.DateTimeUtil;
import net.gepafin.tendermanagement.util.Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -124,6 +126,17 @@ public class CallDao {
callEntity.setConfidi(createCallRequest.getConfidi());
}
callEntity.setDocumentationRequested(createCallRequest.getDocumentationRequested());
+ if (createCallRequest.getAmountMin() != null && createCallRequest.getAmountMin().compareTo(BigDecimal.ZERO) < 0) {
+ throw new CustomValidationException(Status.VALIDATION_ERROR,Translator.toLocale(GepafinConstant.AMOUNT_GREATER_THAN_ZERO_MSG));
+ }
+ callEntity.setAmountMin(createCallRequest.getAmountMin());
+ if(createCallRequest.getEmail()!=null && Boolean.FALSE.equals(Utils.isValidEmail(createCallRequest.getEmail()))){
+ throw new CustomValidationException(Status.VALIDATION_ERROR,Translator.toLocale(GepafinConstant.VALIDATION_EMAIL,createCallRequest.getEmail()));
+ }
+ callEntity.setEmail(createCallRequest.getEmail());
+ callEntity.setPhoneNumber(createCallRequest.getPhoneNumber());
+ callEntity.setStartTime(DateTimeUtil.parseTime(createCallRequest.getStartTime()));
+ callEntity.setEndTime(DateTimeUtil.parseTime(createCallRequest.getEndTime()));
callEntity = callRepository.save(callEntity);
return callEntity;
}
@@ -259,6 +272,11 @@ public class CallDao {
createCallResponseBean.setDocumentationRequested(callEntity.getDocumentationRequested());
createCallResponseBean.setPriorityArea(callEntity.getPriorityArea());
createCallResponseBean.setConfidi(callEntity.getConfidi());
+ createCallResponseBean.setAmountMin(callEntity.getAmountMin());
+ createCallResponseBean.setPhoneNumber(callEntity.getPhoneNumber());
+ createCallResponseBean.setEndTime(callEntity.getEndTime());
+ createCallResponseBean.setStartTime(callEntity.getStartTime());
+ createCallResponseBean.setEmail(callEntity.getEmail());
createCallResponseBean.setCreatedDate(callEntity.getCreatedDate());
createCallResponseBean.setUpdatedDate(callEntity.getUpdatedDate());
return createCallResponseBean;
@@ -456,6 +474,18 @@ public class CallDao {
setIfUpdated(callEntity::getAmountMax, callEntity::setAmountMax, updateCallRequest.getAmountMax());
setIfUpdated(callEntity::getDocumentationRequested, callEntity::setDocumentationRequested,
updateCallRequest.getDocumentationRequested());
+
+ if (updateCallRequest.getAmountMin() != null && updateCallRequest.getAmountMin().compareTo(BigDecimal.ZERO) < 0) {
+ throw new CustomValidationException(Status.VALIDATION_ERROR,Translator.toLocale(GepafinConstant.AMOUNT_GREATER_THAN_ZERO_MSG));
+ }
+ if(updateCallRequest.getEmail()!=null && Boolean.FALSE.equals(Utils.isValidEmail(updateCallRequest.getEmail()))){
+ throw new CustomValidationException(Status.VALIDATION_ERROR,Translator.toLocale(GepafinConstant.VALIDATION_EMAIL,updateCallRequest.getEmail()));
+ }
+ setIfUpdated(callEntity::getAmountMin, callEntity::setAmountMin, updateCallRequest.getAmountMin());
+ setIfUpdated(callEntity::getEmail, callEntity::setEmail, updateCallRequest.getEmail());
+ setIfUpdated(callEntity::getPhoneNumber, callEntity::setPhoneNumber, updateCallRequest.getPhoneNumber());
+ setIfUpdated(callEntity::getStartTime, callEntity::setStartTime, DateTimeUtil.parseTime(updateCallRequest.getStartTime()));
+ setIfUpdated(callEntity::getEndTime, callEntity::setEndTime, DateTimeUtil.parseTime(updateCallRequest.getEndTime()));
setIfUpdated(callEntity::getConfidi, callEntity::setConfidi, updateCallRequest.getConfidi());
updateLookUpData(callEntity, updateCallRequest.getAimedTo(), LookUpDataTypeEnum.AIMED_TO);
updateFaq(updateCallRequest.getFaq(), callEntity, userEntity, LookUpDataTypeEnum.FAQ);
@@ -531,6 +561,11 @@ public class CallDao {
callDetailsResponseBean.setThreshold(callEntity.getThreshold());
callDetailsResponseBean.setDocumentationRequested(callEntity.getDocumentationRequested());
callDetailsResponseBean.setPriorityArea(callEntity.getPriorityArea());
+ callDetailsResponseBean.setAmountMin(callEntity.getAmountMin());
+ callDetailsResponseBean.setEmail(callEntity.getEmail());
+ callDetailsResponseBean.setEndTime(callEntity.getEndTime());
+ callDetailsResponseBean.setStartTime(callEntity.getStartTime());
+ callDetailsResponseBean.setPhoneNumber(callEntity.getPhoneNumber());
callDetailsResponseBean.setCreatedDate(callEntity.getCreatedDate());
callDetailsResponseBean.setUpdatedDate(callEntity.getUpdatedDate());
return callDetailsResponseBean;
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java
new file mode 100644
index 00000000..219b1579
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java
@@ -0,0 +1,175 @@
+package net.gepafin.tendermanagement.dao;
+
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import net.gepafin.tendermanagement.config.Translator;
+import net.gepafin.tendermanagement.constants.GepafinConstant;
+import net.gepafin.tendermanagement.entities.CompanyEntity;
+import net.gepafin.tendermanagement.entities.UserEntity;
+import net.gepafin.tendermanagement.entities.UserWithCompanyEntity;
+import net.gepafin.tendermanagement.model.request.CompanyRequest;
+import net.gepafin.tendermanagement.model.response.CompanyResponse;
+import net.gepafin.tendermanagement.repositories.CompanyRepository;
+import net.gepafin.tendermanagement.repositories.UserWithCompanyRepository;
+import net.gepafin.tendermanagement.service.UserService;
+import net.gepafin.tendermanagement.util.Utils;
+import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
+import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException;
+import net.gepafin.tendermanagement.web.rest.api.errors.Status;
+
+@Component
+public class CompanyDao {
+
+ @Autowired
+ private CompanyRepository companyRepository;
+
+ @Autowired
+ private UserService userService;
+
+ @Autowired
+ private UserWithCompanyRepository userWithCompanyRepository;
+
+ public CompanyResponse createCompany(UserEntity userEntity, CompanyRequest companyRequest) {
+ CompanyEntity existingCompany = companyRepository.findByVatNumber(companyRequest.getVatNumber());
+ if (existingCompany != null) {
+ UserWithCompanyEntity existingRelation = userWithCompanyRepository.findByUserIdAndCompanyId(userEntity.getId(), existingCompany.getId())
+ .orElse(null);
+ if (existingRelation == null) {
+ createUserWithCompanyRelation(userEntity, existingCompany);
+ } else {
+ throw new CustomValidationException(Status.VALIDATION_ERROR,
+ Translator.toLocale(GepafinConstant.USER_ALREADY_CONNECTED_TO_COMPANY));
+ }
+ return convertCompanyEntityToCompanyResponse(existingCompany);
+ } else {
+ validateCompany(companyRequest);
+ CompanyEntity companyEntity = convertCompanyRequestToCompanyEntity(companyRequest);
+ companyRepository.save(companyEntity);
+ createUserWithCompanyRelation(userEntity, companyEntity);
+ return convertCompanyEntityToCompanyResponse(companyEntity);
+ }
+ }
+
+
+ private void validateCompany(CompanyRequest companyRequest) {
+
+ if (Boolean.FALSE.equals(StringUtils.isEmpty(companyRequest.getEmail()))
+ && Boolean.FALSE.equals(Utils.isValidEmail(companyRequest.getEmail()))) {
+ throw new CustomValidationException(Status.VALIDATION_ERROR,
+ Translator.toLocale(GepafinConstant.INVALID_EMAIL));
+ }
+ if (StringUtils.isEmpty(companyRequest.getVatNumber())) {
+ throw new CustomValidationException(Status.VALIDATION_ERROR,
+ Translator.toLocale(GepafinConstant.VATNUMBER_MANDATORY));
+ }
+ if (companyRepository.existsByVatNumber(companyRequest.getVatNumber())) {
+ throw new CustomValidationException(Status.VALIDATION_ERROR,
+ Translator.toLocale(GepafinConstant.VATNUMBER_ALREADY_EXISTS));
+ }
+ }
+
+ private UserWithCompanyEntity createUserWithCompanyRelation(UserEntity userEntity, CompanyEntity companyEntity) {
+ UserWithCompanyEntity userWithCompanyEntity = new UserWithCompanyEntity();
+ if (userEntity.getBeneficiary() != null) {
+ userWithCompanyEntity.setBeneficiaryId(userEntity.getBeneficiary().getId());
+ }
+ userWithCompanyEntity.setCompanyId(companyEntity.getId());
+ userWithCompanyEntity.setUserId(userEntity.getId());
+ return userWithCompanyRepository.save(userWithCompanyEntity);
+ }
+
+ private CompanyEntity convertCompanyRequestToCompanyEntity(CompanyRequest request) {
+ CompanyEntity entity = new CompanyEntity();
+ entity.setCompanyName(request.getCompanyName());
+ entity.setVatNumber(request.getVatNumber());
+ entity.setCodiceFiscale(request.getCodiceFiscale());
+ entity.setAddress(request.getAddress());
+ entity.setPhoneNumber(request.getPhoneNumber());
+ entity.setCity(request.getCity());
+ entity.setProvince(request.getProvince());
+ entity.setCap(request.getCap());
+ entity.setCountry(request.getCountry());
+ entity.setPec(request.getPec());
+ entity.setEmail(request.getEmail());
+ entity.setNumberOfEmployees(request.getNumberOfEmployees());
+ entity.setAnnualRevenue(request.getAnnualRevenue());
+ return entity;
+ }
+
+ private CompanyResponse convertCompanyEntityToCompanyResponse(CompanyEntity entity) {
+ CompanyResponse response = new CompanyResponse();
+ response.setId(entity.getId());
+ response.setCompanyName(entity.getCompanyName());
+ response.setVatNumber(entity.getVatNumber());
+ response.setCodiceFiscale(entity.getCodiceFiscale());
+ response.setAddress(entity.getAddress());
+ response.setPhoneNumber(entity.getPhoneNumber());
+ response.setCity(entity.getCity());
+ response.setProvince(entity.getProvince());
+ response.setCap(entity.getCap());
+ response.setCountry(entity.getCountry());
+ response.setPec(entity.getPec());
+ response.setEmail(entity.getEmail());
+ response.setNumberOfEmployees(entity.getNumberOfEmployees());
+ response.setAnnualRevenue(entity.getAnnualRevenue());
+ response.setCreatedDate(entity.getCreatedDate());
+ response.setUpdatedDate(entity.getUpdatedDate());
+ return response;
+ }
+
+ public CompanyResponse updateCompany(UserEntity userEntity, Long companyId, CompanyRequest companyRequest) {
+ CompanyEntity companyEntity = validateCompany(companyId);
+ Utils.setIfUpdated(companyEntity::getCompanyName, companyEntity::setCompanyName,
+ companyRequest.getCompanyName());
+ Utils.setIfUpdated(companyEntity::getVatNumber, companyEntity::setVatNumber, companyRequest.getVatNumber());
+ Utils.setIfUpdated(companyEntity::getCodiceFiscale, companyEntity::setCodiceFiscale,
+ companyRequest.getCodiceFiscale());
+ Utils.setIfUpdated(companyEntity::getAddress, companyEntity::setAddress, companyRequest.getAddress());
+ Utils.setIfUpdated(companyEntity::getPhoneNumber, companyEntity::setPhoneNumber,
+ companyRequest.getPhoneNumber());
+ Utils.setIfUpdated(companyEntity::getCity, companyEntity::setCity, companyRequest.getCity());
+ Utils.setIfUpdated(companyEntity::getProvince, companyEntity::setProvince, companyRequest.getProvince());
+ Utils.setIfUpdated(companyEntity::getCap, companyEntity::setCap, companyRequest.getCap());
+ Utils.setIfUpdated(companyEntity::getCountry, companyEntity::setCountry, companyRequest.getCountry());
+ Utils.setIfUpdated(companyEntity::getPec, companyEntity::setPec, companyRequest.getPec());
+ Utils.setIfUpdated(companyEntity::getEmail, companyEntity::setEmail, companyRequest.getEmail());
+ Utils.setIfUpdated(companyEntity::getNumberOfEmployees, companyEntity::setNumberOfEmployees,
+ companyRequest.getNumberOfEmployees());
+ Utils.setIfUpdated(companyEntity::getAnnualRevenue, companyEntity::setAnnualRevenue,
+ companyRequest.getAnnualRevenue());
+ companyRepository.save(companyEntity);
+ return convertCompanyEntityToCompanyResponse(companyEntity);
+ }
+
+ public CompanyEntity validateCompany(Long companyId) {
+ return companyRepository.findById(companyId).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
+ Translator.toLocale(GepafinConstant.COMPANY_NOT_FOUND_MSG)));
+ }
+
+ public CompanyResponse getCompany(UserEntity userEntity, Long companyId) {
+ return convertCompanyEntityToCompanyResponse(validateCompany(companyId));
+ }
+
+ public void deleteCompany(UserEntity userEntity, Long companyId) {
+ CompanyEntity companyEntity = validateCompany(companyId);
+ companyRepository.delete(companyEntity);
+ userWithCompanyRepository.deleteByCompanyId(companyId);
+ }
+
+ public List getCompanyByUserId(Long userId) {
+ UserEntity userEntity = userService.validateUser(userId);
+ List companyIds = userWithCompanyRepository.findCompanyIdByUserId(userEntity.getId());
+ List list = companyRepository.findByIdIn(companyIds);
+ return list.stream().map(this::convertCompanyEntityToCompanyResponse).toList();
+ }
+
+ public UserWithCompanyEntity validateUserWithCompny(Long userId, Long companyId) {
+ return userWithCompanyRepository.findByUserIdAndCompanyId(userId, companyId).orElseThrow(() -> new CustomValidationException(Status.UNAUTHORIZED,
+ Translator.toLocale(GepafinConstant.UNAUTHORIZED)));
+ }
+
+}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java
index b8ebd278..cfec2fe2 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java
@@ -12,8 +12,11 @@ import net.gepafin.tendermanagement.model.request.FaqReq;
import net.gepafin.tendermanagement.model.response.FaqResponseBean;
import net.gepafin.tendermanagement.repositories.FaqRepository;
import net.gepafin.tendermanagement.service.CallService;
+import net.gepafin.tendermanagement.service.CompanyService;
import net.gepafin.tendermanagement.service.LookUpDataService;
import net.gepafin.tendermanagement.util.DateTimeUtil;
+import net.gepafin.tendermanagement.util.Validator;
+import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException;
import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import org.springframework.beans.factory.annotation.Autowired;
@@ -35,12 +38,25 @@ public class FaqDao {
@Autowired
private LookUpDataService lookUpDataService;
+
+ @Autowired
+ private Validator validator;
+
+ @Autowired
+ private CompanyService companyService;
- public FaqResponseBean createFaq(FaqReq faqRequest, UserEntity userEntity, Long callId) {
- FaqEntity entity = new FaqEntity();
+ public FaqResponseBean createFaq(FaqReq faqRequest, UserEntity userEntity, Long callId, Long companyId) {
CallEntity callEntity = callService.validateCall(callId);
- entity = createOrUpdateFaqEntity(faqRequest, callEntity, userEntity,
+ FaqEntity entity = createOrUpdateFaqEntity(faqRequest, callEntity, userEntity,
LookUpDataEntity.LookUpDataTypeEnum.FAQ);
+ if (validator.checkIsBeneficiary() && companyId == null) {
+ throw new CustomValidationException(Status.VALIDATION_ERROR,
+ Translator.toLocale(GepafinConstant.COMPANY_ID_MANDATORY));
+ }
+ if(companyId!=null) {
+ companyService.validateCompany(companyId);
+ entity.setCompanyId(companyId);
+ }
faqRepository.save(entity);
return convertToFaqResponseBean(entity);
}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java
index 34bf0e59..2fbf0943 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java
@@ -4,19 +4,16 @@ import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.CallEntity;
import net.gepafin.tendermanagement.entities.FlowDataEntity;
-import net.gepafin.tendermanagement.entities.FlowDataEntity;
import net.gepafin.tendermanagement.entities.FlowEdgesEntity;
+import net.gepafin.tendermanagement.enums.CallStatusEnum;
import net.gepafin.tendermanagement.model.request.FlowDataRequestBean;
import net.gepafin.tendermanagement.model.request.FlowEdgesRequestBean;
import net.gepafin.tendermanagement.model.request.FlowRequestBean;
-import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean;
import net.gepafin.tendermanagement.model.response.FlowDataResponseBean;
import net.gepafin.tendermanagement.model.response.FlowEdgesResponseBean;
import net.gepafin.tendermanagement.model.response.FlowResponseBean;
import net.gepafin.tendermanagement.repositories.CallRepository;
import net.gepafin.tendermanagement.repositories.FlowDataRepository;
-import net.gepafin.tendermanagement.repositories.FlowDataRepository;
-import net.gepafin.tendermanagement.repositories.FlowEdgesRepository;
import net.gepafin.tendermanagement.repositories.FlowEdgesRepository;
import net.gepafin.tendermanagement.service.CallService;
import net.gepafin.tendermanagement.service.FormService;
@@ -28,7 +25,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
-import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@@ -193,6 +189,7 @@ public class FlowDao {
return null;
}
flowResponseBean.setCallId(call.getId());
+ flowResponseBean.setCallStatus(CallStatusEnum.valueOf(call.getStatus()));
flowResponseBean.setInitialForm(call.getInitialForm());
flowResponseBean.setFinalForm(call.getFinalForm());
return flowResponseBean;
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java
index 0df71aa8..b99ba6c2 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java
@@ -1,10 +1,9 @@
package net.gepafin.tendermanagement.dao;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
+import java.util.*;
+import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum;
+import net.gepafin.tendermanagement.repositories.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -18,13 +17,8 @@ import net.gepafin.tendermanagement.entities.FlowEdgesEntity;
import net.gepafin.tendermanagement.entities.FormEntity;
import net.gepafin.tendermanagement.enums.FormActionEnum;
import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse;
-import net.gepafin.tendermanagement.repositories.ApplicationFormFieldRepository;
-import net.gepafin.tendermanagement.repositories.ApplicationFormRepository;
-import net.gepafin.tendermanagement.repositories.FlowDataRepository;
-import net.gepafin.tendermanagement.repositories.FlowEdgesRepository;
import net.gepafin.tendermanagement.service.FormService;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
-import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException;
import net.gepafin.tendermanagement.web.rest.api.errors.Status;
@Component
@@ -47,7 +41,10 @@ public class FlowFormDao {
@Autowired
private FormService formService;
-
+ @Autowired
+ private FormDao formDao;
+
+
// Long getNextForm(FormEntity currentFormEntity, ApplicationEntity applicationEntity) {
// // vlaidation if next form findout and cuuent from is not fill the give error
@@ -177,52 +174,79 @@ public class FlowFormDao {
.orElse(null);
}
- public Long getPreviousForm(FormEntity currentFormEntity, ApplicationEntity applicationEntity) {
- // Retrieve the flow edges for the previous forms
- List flowEdgesList = flowEdgesRepository.findByTargetIdAndCallId(
- currentFormEntity.getId(), applicationEntity.getCall().getId());
+// public Long getPreviousForm(FormEntity currentFormEntity, ApplicationEntity applicationEntity) {
+// // Retrieve the flow edges for the previous forms
+// List flowEdgesList = flowEdgesRepository.findByTargetIdAndCallId(
+// currentFormEntity.getId(), applicationEntity.getCall().getId());
+//
+// if (flowEdgesList.isEmpty()) {
+// return null;
+//// throw new ResourceNotFoundException(Status.NOT_FOUND,
+//// Translator.toLocale(GepafinConstant.PREVIOUS_FORM_NOT_FOUND));
+// }
+//
+// // If only one edge exists, return the source form ID
+// if (flowEdgesList.size() == 1) {
+// return flowEdgesList.get(0).getSourceId();
+// }
+//
+// // For multiple edges, find the previous form based on the chosen value
+// List previousFormIds = flowEdgesList.stream()
+// .map(FlowEdgesEntity::getSourceId)
+// .toList();
+//
+// // Fetch the flow data based on previous form IDs
+// List flowDataList = flowDataRepository.findByFormIdInAndCallId(
+// previousFormIds, applicationEntity.getCall().getId());
+//
+// List chosenValues = flowDataList.stream()
+// .map(FlowDataEntity::getChoosenValue)
+// .toList();
+//
+// // Fetch the previous forms based on the chosen field values
+// Set formList = applicationFormFieldRepository
+// .findByFieldValueInAndApplicationFormApplicationId(chosenValues, applicationEntity.getId()).stream()
+// .map(fieldEntity -> fieldEntity.getApplicationForm().getForm())
+// .collect(Collectors.toSet());
+//
+// // Find next form IDs recursively for all forms in the formList
+// List fieldIds = formList.stream()
+// .map(formEntity -> getNextForm(formEntity, applicationEntity))
+// .toList();
+//
+// // Return the first matching previous form ID that corresponds to a next form
+// return previousFormIds.stream()
+// .filter(fieldIds::contains)
+// .findFirst().orElse(null);
+// }
- if (flowEdgesList.isEmpty()) {
- return null;
+ public Long getPreviousForm(FormEntity currentFormEntity, ApplicationEntity applicationEntity) {
+
+ List flowEdgesList = flowEdgesRepository.findByTargetIdAndCallId(
+ currentFormEntity.getId(), applicationEntity.getCall().getId());
+
+ if (flowEdgesList.isEmpty()) {
+ return null;
// throw new ResourceNotFoundException(Status.NOT_FOUND,
// Translator.toLocale(GepafinConstant.PREVIOUS_FORM_NOT_FOUND));
}
- // If only one edge exists, return the source form ID
- if (flowEdgesList.size() == 1) {
- return flowEdgesList.get(0).getSourceId();
- }
+ // // If only one edge exists, return the source form ID
+ // if (flowEdgesList.size() == 1) {
+ // return flowEdgesList.get(0).getSourceId();
+ // }
// For multiple edges, find the previous form based on the chosen value
- List previousFormIds = flowEdgesList.stream()
- .map(FlowEdgesEntity::getSourceId)
- .toList();
+ List previousFormIds = flowEdgesList.stream()
+ .map(FlowEdgesEntity::getSourceId)
+ .toList();
- // Fetch the flow data based on previous form IDs
- List flowDataList = flowDataRepository.findByFormIdInAndCallId(
- previousFormIds, applicationEntity.getCall().getId());
+ List applicationFormEntities=applicationFormRepository.findByFormIdInAndApplicationId(previousFormIds,applicationEntity.getId());
- List chosenValues = flowDataList.stream()
- .map(FlowDataEntity::getChoosenValue)
- .toList();
+ applicationFormEntities.sort(Comparator.comparing(ApplicationFormEntity::getCreatedDate).reversed());
- // Fetch the previous forms based on the chosen field values
- Set formList = applicationFormFieldRepository
- .findByFieldValueInAndApplicationFormApplicationId(chosenValues, applicationEntity.getId()).stream()
- .map(fieldEntity -> fieldEntity.getApplicationForm().getForm())
- .collect(Collectors.toSet());
-
- // Find next form IDs recursively for all forms in the formList
- List fieldIds = formList.stream()
- .map(formEntity -> getNextForm(formEntity, applicationEntity))
- .toList();
-
- // Return the first matching previous form ID that corresponds to a next form
- return previousFormIds.stream()
- .filter(fieldIds::contains)
- .findFirst().orElse(null);
+ return applicationFormEntities.isEmpty() ? null : applicationFormEntities.get(0).getForm().getId();
}
-
public NextOrPreviousFormResponse getnextOrPreviousForm(ApplicationEntity applicationEntity, Long formId,
FormActionEnum action) {
Long calculatedFormId = null;
@@ -248,37 +272,71 @@ public class FlowFormDao {
}
}
NextOrPreviousFormResponse nextOrPreviousFormResponse = null;
- if (calculatedFormId != null) {
- nextOrPreviousFormResponse = setNextOrPreviousResponse(calculatedFormId, applicationEntity);
+ if (calculatedFormId == null && formId == null) {
+ FormEntity form=formService.validateForm(applicationEntity.getCall().getInitialForm());
+ calculatedFormId=form.getId();
}
+ if (calculatedFormId == null) {
+ calculatedFormId=formId;
+ }
+ nextOrPreviousFormResponse = setNextOrPreviousResponse(calculatedFormId, applicationEntity);
+
return nextOrPreviousFormResponse;
}
private NextOrPreviousFormResponse setNextOrPreviousResponse(Long calculatedFormId, ApplicationEntity applicationEntity) {
NextOrPreviousFormResponse nextOrPreviousFormResponse = new NextOrPreviousFormResponse();
+ Integer completedSteps=0;
FormEntity formEntity = formService.validateForm(calculatedFormId);
nextOrPreviousFormResponse.setFormId(calculatedFormId);
+ nextOrPreviousFormResponse.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(applicationEntity.getStatus()));
nextOrPreviousFormResponse.setApplicationFormResponse(
applicationDao.processForm(formEntity, applicationEntity));
nextOrPreviousFormResponse.setCallId(applicationEntity.getCall().getId());
nextOrPreviousFormResponse.setCallTitle(applicationEntity.getCall().getName());
+ nextOrPreviousFormResponse.setCompanyId(applicationEntity.getCompany().getId());
+ nextOrPreviousFormResponse.setCompanyName(applicationEntity.getCompany().getCompanyName());
List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId());
- Long totalFormSteps = 3l;
- if (flowEdgesList.size() == 1) {
- totalFormSteps = 2l;
+ Long totalFormSteps = calculateTotalSteps(flowEdgesList);
+ Long currentStep = calculateCurrentStep(formEntity);
+ nextOrPreviousFormResponse.setTotalFormSteps(totalFormSteps);
+ completedSteps = getCompletedSteps(applicationEntity);
+ nextOrPreviousFormResponse.setCompletedSteps(Long.valueOf(completedSteps));
+ nextOrPreviousFormResponse.setCurrentStep(currentStep);
+ return nextOrPreviousFormResponse;
+ }
+
+ public Integer getCompletedSteps(ApplicationEntity applicationEntity) {
+ Integer completedSteps=0;
+ List applicationFormList = applicationFormRepository.findByApplicationId(applicationEntity.getId());
+ List applicationFormFieldEntities=new ArrayList<>();
+ for (ApplicationFormEntity applicationFormEntity:applicationFormList){
+ applicationFormFieldEntities=applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId());
+ Boolean isCompleted=formDao.validateCompletedSteps(applicationFormFieldEntities, applicationEntity, applicationFormEntity.getForm());
+ if(Boolean.TRUE.equals(isCompleted)){
+ completedSteps++;
+ }
}
+ return completedSteps;
+ }
+
+ public Long calculateCurrentStep(FormEntity formEntity) {
Long currentStep = 2l;
if (formEntity.getId().equals(formEntity.getCall().getInitialForm())) {
currentStep = 1l;
} else if (formEntity.getId().equals(formEntity.getCall().getFinalForm())) {
currentStep = 3l;
}
- List applicationFormList = applicationFormRepository.findByApplicationId(applicationEntity.getId());
- nextOrPreviousFormResponse.setTotalFormSteps(totalFormSteps);
- nextOrPreviousFormResponse.setCompletedSteps(Long.valueOf(applicationFormList.size()));
- nextOrPreviousFormResponse.setCurrentStep(currentStep);
- return nextOrPreviousFormResponse;
+ return currentStep;
+ }
+
+ public Long calculateTotalSteps(List flowEdgesList) {
+ Long totalFormSteps = 3l;
+ if (flowEdgesList.size() == 1) {
+ totalFormSteps = 2l;
+ }
+ return totalFormSteps;
}
private Long getDefaultForm(ApplicationEntity applicationEntity) {
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java
index 11a27915..9cdf3fed 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java
@@ -73,6 +73,7 @@ public class FormDao {
formResponseBean.setContent(Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class));
formResponseBean.setLabel(formEntity.getLabel());
formResponseBean.setCallId(formEntity.getCall().getId());
+ formResponseBean.setCallStatus(formEntity.getCall().getStatus());
return formResponseBean;
}
public FormResponseBean createForm(Long callId,FormRequest formRequest){
@@ -140,6 +141,13 @@ public class FormDao {
);
}
}
+ else {
+ Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, formRequest.getLabel());
+ Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, setContentResponseBean(formRequest.getContent()));
+ formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
+ formEntity = saveFormEntity(formEntity);
+ return convertFormEntityToFormResponseBean(formEntity);
+ }
}
}
}
@@ -197,6 +205,8 @@ public class FormDao {
public void validateFormField(List applicationFormFieldRequestList, ApplicationEntity applicationEntity, FormEntity formEntity) {
Map formFieldMap = new LinkedHashMap();
for(ApplicationFormFieldRequestBean applicationFormFieldRequestBean:applicationFormFieldRequestList) {
+ if(applicationFormFieldRequestBean.getFieldValue()==null || applicationFormFieldRequestBean.getFieldValue().isEmpty())
+ continue;
formFieldMap.put(applicationFormFieldRequestBean.getFieldId(),applicationFormFieldRequestBean.getFieldValue());
}
@@ -206,22 +216,23 @@ public class FormDao {
FieldValidator validator = FieldValidator.create();
formResponseBean.getContent().forEach(contentResponseBean -> {
String fieldId = contentResponseBean.getId();
- String value = String.valueOf(formFieldMap.get(fieldId));
+ String value = (String) formFieldMap.get(fieldId);
+ String fieldLabel=contentResponseBean.getLabel();
if(value == null && isApplicationFormExist) {
return;
}
FieldValidatorBean fieldValidatorBean = Utils.convertSourceObjectToDestinationObject(contentResponseBean.getValidators(), FieldValidatorBean.class);
validator
- .notNull(value, fieldId)
- .isRequired(value,fieldValidatorBean.getIsRequired(),fieldId)
- .minLength(value, fieldValidatorBean.getMinLength(), fieldId) // Only applies if minLength is not null
- .maxLength(value, fieldValidatorBean.getMaxLength(), fieldId) // Only applies if maxLength is not null
- .matchesPattern(value, fieldValidatorBean.getPattern(), fieldId) // Only applies if pattern is present
- .validateCustom(value, fieldValidatorBean.getCustom(), fieldId); // Add the custom validation here
+ .minLength(value, fieldValidatorBean.getMinLength(), fieldLabel) // Only applies if minLength is not null
+ .maxLength(value, fieldValidatorBean.getMaxLength(), fieldLabel) // Only applies if maxLength is not null
+ .matchesPattern(value, fieldValidatorBean.getPattern(), fieldLabel) // Only applies if pattern is present
+ .validateCustom(value, fieldValidatorBean.getCustom(), fieldLabel); // Add the custom validation here
if (fieldValidatorBean.getCustom() != null && fieldValidatorBean.getCustom().equals(GepafinConstant.IS_PIVA)) {
- String error = validateVatNumber(value, fieldValidatorBean.getCustom(), fieldId);
- validator.addError(error);
+ String error = validateVatNumber(value, fieldValidatorBean.getCustom(), fieldLabel);
+ if(error != null) {
+ validator.addError(error);
+ }
}
});
validator.validate();
@@ -234,9 +245,31 @@ public class FormDao {
return false;
}
+ public Boolean validateCompletedSteps(List applicationFormFieldEntityList, ApplicationEntity applicationEntity, FormEntity formEntity) {
+ Map formFieldMap = new LinkedHashMap();
+ for(ApplicationFormFieldEntity applicationFormFieldEntity:applicationFormFieldEntityList) {
+ formFieldMap.put(applicationFormFieldEntity.getFieldId(),applicationFormFieldEntity.getFieldValue());
+ }
+
+ FormResponseBean formResponseBean = convertFormEntityToFormResponseBean(formEntity);
+ FieldValidator validator = FieldValidator.create();
+ formResponseBean.getContent().forEach(contentResponseBean -> {
+ String fieldId = contentResponseBean.getId();
+ String value = (String) formFieldMap.get(fieldId);
+
+ FieldValidatorBean fieldValidatorBean = Utils.convertSourceObjectToDestinationObject(contentResponseBean.getValidators(), FieldValidatorBean.class);
+ validator
+ .isRequired(value,fieldValidatorBean.getIsRequired(),fieldId);
+ });
+ if (validator.hasErrors()) {
+ return false; // Validation failed, return false
+ }
+ return true;
+ }
public String validateVatNumber(String value,String customRule,String fieldId){
String error=null;
- if (value.matches("^\\d{1,11}$")) {
+
+ if (value!=null && value.matches("^\\d{1,11}$")) {
Map customData=null;
try {
Map vatCheckResponse = vatCheckDao.checkVatNumberApi(value);
@@ -249,4 +282,5 @@ public class FormDao {
}
return error;
}
+
}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java
index ef80acbb..cb4f41fd 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java
@@ -4,6 +4,7 @@ import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.RegionEntity;
import net.gepafin.tendermanagement.entities.RoleEntity;
+import net.gepafin.tendermanagement.enums.RoleStatusEnum;
import net.gepafin.tendermanagement.model.request.RoleReq;
import net.gepafin.tendermanagement.model.response.RegionResponseBean;
import net.gepafin.tendermanagement.model.response.RoleResponseBean;
@@ -119,4 +120,8 @@ public class RoleDao {
log.info("Total roles found: {}", roles.size());
return roles;
}
+
+ public RoleEntity getRoleByType(RoleStatusEnum roleStatus) {
+ return roleRepository.findByRoleType(roleStatus.getValue());
+ }
}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java
index 81033b05..53825d01 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java
@@ -4,36 +4,47 @@ import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant;
+import net.gepafin.tendermanagement.entities.BeneficiaryEntity;
import net.gepafin.tendermanagement.entities.RoleEntity;
import net.gepafin.tendermanagement.entities.UserEntity;
+import net.gepafin.tendermanagement.enums.RoleStatusEnum;
import net.gepafin.tendermanagement.enums.UserStatusEnum;
import net.gepafin.tendermanagement.model.request.*;
+import net.gepafin.tendermanagement.model.response.CompanyResponse;
import net.gepafin.tendermanagement.model.response.RoleResponseBean;
+import net.gepafin.tendermanagement.model.response.UserSamlResponse;
import net.gepafin.tendermanagement.model.response.UserResponseBean;
import net.gepafin.tendermanagement.model.util.JWTToken;
+import net.gepafin.tendermanagement.repositories.BeneficiaryRepository;
import net.gepafin.tendermanagement.repositories.UserRepository;
+import net.gepafin.tendermanagement.service.CompanyService;
import net.gepafin.tendermanagement.service.impl.AuthenticationService;
+import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException;
import net.gepafin.tendermanagement.web.rest.api.errors.Status;
+
+import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
-import java.security.SecureRandom;
-import java.util.Base64;
+
+import java.util.List;
import static net.gepafin.tendermanagement.util.Utils.setIfUpdated;
-@Repository
+@Component
public class UserDao {
private final Logger log = LoggerFactory.getLogger(UserDao.class);
@Autowired
private UserRepository userRepository;
-
+ @Autowired
+ private CompanyDao companyDao;
@Autowired
private AuthenticationService authService;
@@ -42,25 +53,85 @@ public class UserDao {
@Autowired
private RoleDao roleDao;
+
+ @Autowired
+ private BeneficiaryRepository beneficiaryRepository;
- public UserResponseBean createUser(UserReq userReq) {
- log.info("Creating user with email: {}", userReq.getEmail());
- if (userRepository.existsByEmailIgnoreCase(userReq.getEmail())) {
- log.error("User creation failed: Email {} already exists", userReq.getEmail());
- throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.EMAIL_ALREADY_EXISTS));
+
+ public JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq) {
+ validateUserRequest(tempToken, userReq);
+ validatePassword(userReq.getPassword(), userReq.getConfPassword(), tempToken);
+
+ RoleEntity roleEntity = getRoleEntity(userReq.getRoleId());
+ BeneficiaryEntity beneficiary = createBeneficiary(roleEntity, userReq);
+ UserEntity userEntity = convertUserRequestToUserEntity(beneficiary, roleEntity, userReq);
+ log.info("User created with ID: {}", userEntity.getId());
+ return authService.getJWTTokenBean(userEntity, Boolean.TRUE);
+ }
+
+ private BeneficiaryEntity createBeneficiary(RoleEntity roleEntity, UserReq userReq) {
+ BeneficiaryEntity beneficiaryEntity = null;
+ if (RoleStatusEnum.ROLE_BENEFICIARY.getValue().equals(roleEntity.getRoleType())) {
+ beneficiaryEntity = new BeneficiaryEntity();
+ beneficiaryEntity.setAddress(userReq.getAddress());
+ beneficiaryEntity.setCity(userReq.getCity());
+ beneficiaryEntity.setCodiceFiscale(userReq.getCodiceFiscale());
+ beneficiaryEntity.setCountry(userReq.getCountry());
+ beneficiaryEntity.setDateOfBirth(userReq.getDateOfBirth());
+ beneficiaryEntity.setEmail(userReq.getEmail());
+ beneficiaryEntity.setFirstName(userReq.getFirstName());
+ beneficiaryEntity.setLastName(userReq.getLastName());
+ beneficiaryEntity.setOrganization(userReq.getOrganization());
+ beneficiaryEntity.setPhoneNumber(userReq.getPhoneNumber());
+ beneficiaryEntity =beneficiaryRepository.save(beneficiaryEntity);
+ }
+ return beneficiaryEntity;
+ }
+
+ private void validateUserRequest(String tempToken, UserReq userReq) {
+ if (Boolean.FALSE.equals(Utils.isValidEmail(userReq.getEmail()))) {
+ throw new CustomValidationException(Status.VALIDATION_ERROR,
+ Translator.toLocale(GepafinConstant.VALIDATE_EMAIL));
+ }
+ log.info("Creating user with email: {}", userReq.getEmail());
+ if (userRepository.existsByEmailIgnoreCase(userReq.getEmail())) {
+ log.error("User creation failed: Email {} already exists", userReq.getEmail());
+ throw new CustomValidationException(Status.VALIDATION_ERROR,
+ Translator.toLocale(GepafinConstant.EMAIL_ALREADY_EXISTS));
+ }
+ if (Boolean.FALSE.equals(StringUtils.isEmpty(userReq.getCodiceFiscale()))
+ && userRepository.existsByBeneficiaryCodiceFiscale(userReq.getCodiceFiscale())) {
+ log.error("User creation failed: CodiceFiscale {} already exists", userReq.getCodiceFiscale());
+ throw new CustomValidationException(Status.VALIDATION_ERROR,
+ Translator.toLocale(GepafinConstant.CODICE_FISCALE_EXISTS));
+ }
+ if (tempToken == null && userReq.getRoleId() == null) {
+ throw new ResourceNotFoundException(Status.VALIDATION_ERROR,
+ Translator.toLocale(GepafinConstant.ROLE_ID_MANDATORY));
+ }
+ if (tempToken != null) {
+ userReq.setRoleId(null);
+ }
+ }
+
+ private void validatePassword(String password, String confirmPassword, String tempToken) {
+ if (StringUtils.isEmpty(password) || StringUtils.isEmpty(confirmPassword)) {
+ if(tempToken == null) {
+ throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.VALIDATE_PASSWORD));
+ }else if(Boolean.FALSE.equals(StringUtils.isEmpty(password) && StringUtils.isEmpty(confirmPassword))){
+ throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.VALIDATE_PASSWORD));
+ }
}
- if (!userReq.getPassword().equals(userReq.getConfPassword())) {
- log.error("User creation failed: Passwords do not match for email {}", userReq.getEmail());
+
+ if (password != null && !password.equals(confirmPassword)) {
+ log.error("User creation failed: Passwords do not match");
throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.PASSWORD_DOESNT_MATCH));
}
- if (userReq.getPassword().length() < 8) {
- log.error("User creation failed: Password length is less than 8 characters for email {}", userReq.getEmail());
+
+ if (password != null && password.length() < 8) {
+ log.error("User creation failed: Password length is less than 8 characters");
throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.PASSWORD_MIN_LEN));
}
- UserEntity userEntity = convertUserRequestToUserEntity(userReq);
- userEntity = userRepository.save(userEntity);
- log.info("User created with ID: {}", userEntity.getId());
- return convertUserEntityToUserResponse(userEntity);
}
public UserResponseBean updateUser(Long userId, UpdateUserReq userReq) {
@@ -86,50 +157,79 @@ public class UserDao {
return convertUserEntityToUserResponse(userEntity);
}
- private UserEntity convertUserRequestToUserEntity(UserReq userReq) {
+ private UserEntity convertUserRequestToUserEntity(BeneficiaryEntity beneficiary, RoleEntity roleEntity, UserReq userReq) {
UserEntity userEntity = new UserEntity();
- userEntity.setPassword(passwordEncoder.encode(userReq.getPassword()));
+ if(Boolean.FALSE.equals(StringUtils.isEmpty(userReq.getPassword()))) {
+ userEntity.setPassword(passwordEncoder.encode(userReq.getPassword()));
+ }
+ userEntity.setRoleEntity(roleEntity);
userEntity.setEmail(userReq.getEmail());
- userEntity.setFirstName(userReq.getFirstName());
- userEntity.setStatus(UserStatusEnum.PENDING_VERIFICATION.getValue());
- userEntity.setLastName(userReq.getLastName());
- userEntity.setOrganization(userReq.getOrganization());
- userEntity.setAddress(userReq.getAddress());
- userEntity.setPhoneNumber(userReq.getPhoneNumber());
- userEntity.setRoleEntity(roleDao.validateRole(userReq.getRoleId()));
- return userEntity;
+ userEntity.setStatus(UserStatusEnum.ACTIVE.getValue());
+ userEntity.setBeneficiary(beneficiary);
+ if (Boolean.FALSE.equals(RoleStatusEnum.ROLE_BENEFICIARY.getValue().equals(roleEntity.getRoleType()))) {
+ userEntity.setFirstName(userReq.getFirstName());
+ userEntity.setLastName(userReq.getLastName());
+ userEntity.setOrganization(userReq.getOrganization());
+ userEntity.setAddress(userReq.getAddress());
+ userEntity.setPhoneNumber(userReq.getPhoneNumber());
+ userEntity.setDateOfBirth(userReq.getDateOfBirth());
+ }
+ return userRepository.save(userEntity);
}
- private UserResponseBean convertUserEntityToUserResponse(UserEntity userEntity) {
- UserResponseBean userResponseBean = new UserResponseBean();
- userResponseBean.setId(userEntity.getId());
- userResponseBean.setCreatedDate(userEntity.getCreatedDate());
- userResponseBean.setUpdatedDate(userEntity.getUpdatedDate());
- userResponseBean.setEmail(userEntity.getEmail());
- userResponseBean.setFirstName(userEntity.getFirstName());
- userResponseBean.setLastName(userEntity.getLastName());
- userResponseBean.setPhoneNumber(userEntity.getPhoneNumber());
- userResponseBean.setOrganization(userEntity.getOrganization());
- userResponseBean.setAddress(userEntity.getAddress());
- userResponseBean.setCity(userEntity.getCity());
- userResponseBean.setCountry(userEntity.getCountry());
- userResponseBean.setStatus(UserStatusEnum.valueOf(userEntity.getStatus()));
- RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(userEntity.getRoleEntity());
- userResponseBean.setRole(roleResponseBean);
- userResponseBean.setLastLogin(userEntity.getLastLogin());
- return userResponseBean;
- }
+ private RoleEntity getRoleEntity(Long roleId) {
+ if(roleId != null) {
+ return roleDao.validateRole(roleId);
+ } else {
+ return roleDao.getRoleByType(RoleStatusEnum.ROLE_BENEFICIARY);
+ }
+ }
- public UserResponseBean getUserById(Long id) {
- log.info("Fetching user with ID: {}", id);
- UserEntity userEntity=validateUser(id);
+ private UserResponseBean convertUserEntityToUserResponse(UserEntity userEntity) {
+ UserResponseBean userResponseBean = new UserResponseBean();
+ userResponseBean.setId(userEntity.getId());
+ userResponseBean.setCreatedDate(userEntity.getCreatedDate());
+ userResponseBean.setUpdatedDate(userEntity.getUpdatedDate());
+ userResponseBean.setEmail(userEntity.getEmail());
+ userResponseBean.setStatus(UserStatusEnum.valueOf(userEntity.getStatus()));
+ RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(userEntity.getRoleEntity());
+ userResponseBean.setRole(roleResponseBean);
+ userResponseBean.setLastLogin(userEntity.getLastLogin());
+ List companyResponseBeans = companyDao.getCompanyByUserId(userEntity.getId());
+ userResponseBean.setCompanies(companyResponseBeans);
+ if (userEntity.getBeneficiary() == null) {
+ userResponseBean.setFirstName(userEntity.getFirstName());
+ userResponseBean.setLastName(userEntity.getLastName());
+ userResponseBean.setPhoneNumber(userEntity.getPhoneNumber());
+ userResponseBean.setOrganization(userEntity.getOrganization());
+ userResponseBean.setAddress(userEntity.getAddress());
+ userResponseBean.setCity(userEntity.getCity());
+ userResponseBean.setCountry(userEntity.getCountry());
+ userResponseBean.setDateOfBirth(userEntity.getDateOfBirth());
+ } else {
+ userResponseBean.setFirstName(userEntity.getBeneficiary().getFirstName());
+ userResponseBean.setLastName(userEntity.getBeneficiary().getLastName());
+ userResponseBean.setPhoneNumber(userEntity.getBeneficiary().getPhoneNumber());
+ userResponseBean.setOrganization(userEntity.getBeneficiary().getOrganization());
+ userResponseBean.setAddress(userEntity.getBeneficiary().getAddress());
+ userResponseBean.setCity(userEntity.getBeneficiary().getCity());
+ userResponseBean.setCountry(userEntity.getBeneficiary().getCountry());
+ userResponseBean.setCodiceFiscale(userEntity.getBeneficiary().getCodiceFiscale());
+ userResponseBean.setDateOfBirth(userEntity.getBeneficiary().getDateOfBirth());
+ }
+ return userResponseBean;
+ }
+
+ public UserResponseBean getUserById(Long id) {
+ log.info("Fetching user with ID: {}", id);
+ UserEntity userEntity = validateUser(id);
// if (!UserStatusEnum.ACTIVE.getValue().equals(userEntity.getStatus())) {
// log.info("User with ID: {} is not active", id);
// throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG));
// }
- log.info("User found: {}", userEntity);
- return convertUserEntityToUserResponse(userEntity);
- }
+ log.info("User found: {}", userEntity);
+ return convertUserEntityToUserResponse(userEntity);
+ }
public void deleteUser(Long id) {
log.info("Deleting user with ID: {}", id);
@@ -150,14 +250,6 @@ public class UserDao {
.orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)));
}
- public String generateSecureToken() {
- SecureRandom secureRandom = new SecureRandom();
- byte[] tokenBytes = new byte[24];
- secureRandom.nextBytes(tokenBytes);
- String token = Base64.getUrlEncoder().withoutPadding().encodeToString(tokenBytes);
- log.debug("Generated secure token: {}", token);
- return token;
- }
public String initiatePasswordReset(InitiatePasswordResetReq resetReq) {
UserEntity user = userRepository.findByEmail(resetReq.getEmail());
@@ -165,7 +257,7 @@ public class UserDao {
log.info("Password reset attempt for non-existent user: {}", resetReq.getEmail());
throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG));
}
- String token = generateSecureToken();
+ String token = Utils.generateSecureToken();
user.setResetPasswordToken(token);
userRepository.save(user);
log.info("Password reset token generated for user: {}", resetReq.getEmail());
@@ -227,4 +319,12 @@ public class UserDao {
return convertUserEntityToUserResponse(userEntity);
}
+ public JWTToken validateExistingUserToken(String token) {
+ return authService.validateExistingUserToken(token);
+ }
+
+ public UserSamlResponse validateNewUserToken(String token) {
+ return authService.validateNewUserToken(token);
+ }
+
}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/VatCheckDao.java b/src/main/java/net/gepafin/tendermanagement/dao/VatCheckDao.java
index 4d1d0f58..f4a07849 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/VatCheckDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/VatCheckDao.java
@@ -1,8 +1,13 @@
package net.gepafin.tendermanagement.dao;
import feign.FeignException;
+import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.service.feignClient.VatCheckService;
+import net.gepafin.tendermanagement.util.Utils;
+import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
+import net.gepafin.tendermanagement.web.rest.api.errors.Status;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -67,8 +72,17 @@ public class VatCheckDao {
}
} catch (FeignException ex) {
log.error("Exception occurred while checking vat number: {0}", ex);
- throw ex;
+ Utils.callException(ex.status(), ex);
}
return responseBody;
}
+
+ public Map checkVatNumber(String vatNumber) {
+ try {
+ return checkVatNumberApi(vatNumber);
+ } catch (Exception e) {
+ throw new CustomValidationException(Status.VALIDATION_ERROR,
+ Translator.toLocale(GepafinConstant.INVALID_VATNUMBER));
+ }
+ }
}
diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java
index 8c9156e3..01648c67 100644
--- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java
+++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java
@@ -13,9 +13,12 @@ import java.time.LocalDateTime;
@Builder
public class ApplicationEntity extends BaseEntity {
+ @Column(name = "USER_ID")
+ private Long userId;
+
@ManyToOne
- @JoinColumn(name = "USER_ID", nullable = false)
- private UserEntity user;
+ @JoinColumn(name = "COMPANY_ID", nullable = false)
+ private CompanyEntity company;
@Column(name = "SUBMISSION_DATE")
private LocalDateTime submissionDate;
@@ -29,7 +32,7 @@ public class ApplicationEntity extends BaseEntity {
@ManyToOne
@JoinColumn(name = "CALL_ID", nullable = false)
private CallEntity call;
-
+
@Column(name="IS_DELETED")
private Boolean isDeleted;
diff --git a/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryEntity.java
new file mode 100644
index 00000000..302f2af5
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryEntity.java
@@ -0,0 +1,47 @@
+package net.gepafin.tendermanagement.entities;
+
+import java.time.LocalDateTime;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
+import jakarta.validation.constraints.Email;
+import lombok.Data;
+
+@Entity
+@Table(name = "BENEFICIARY")
+@Data
+public class BeneficiaryEntity extends BaseEntity {
+
+ @Email
+ @Column(name = "EMAIL")
+ private String email;
+
+ @Column(name = "FIRST_NAME")
+ private String firstName;
+
+ @Column(name = "LAST_NAME")
+ private String lastName;
+
+ @Column(name = "PHONE_NUMBER")
+ private String phoneNumber;
+
+ @Column(name = "ORGANIZATION")
+ private String organization;
+
+ @Column(name = "ADDRESS")
+ private String address;
+
+ @Column(name = "CITY")
+ private String city;
+
+ @Column(name = "COUNTRY")
+ private String country;
+
+ @Column(name = "CODICE_FISCALE")
+ private String codiceFiscale;
+
+ @Column(name = "DATE_OF_BIRTH")
+ private LocalDateTime dateOfBirth;
+
+}
diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java
index 02c53fca..f0bb3896 100644
--- a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java
+++ b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java
@@ -8,6 +8,7 @@ import lombok.Builder;
import java.math.BigDecimal;
import java.time.LocalDateTime;
+import java.time.LocalTime;
@Entity
@Table(name = "CALL")
@@ -68,5 +69,20 @@ public class CallEntity extends BaseEntity {
@Column(name="FINAL_FORM")
private Long finalForm;
+
+ @Column(name = "AMOUNT_MIN")
+ private BigDecimal amountMin;
+
+ @Column(name="EMAIL")
+ private String email;
+
+ @Column(name = "PHONE_NUMBER")
+ private String phoneNumber;
+
+ @Column(name = "START_TIME")
+ private LocalTime startTime;
+
+ @Column(name = "END_TIME")
+ private LocalTime endTime;
}
diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java
new file mode 100644
index 00000000..347e4db1
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java
@@ -0,0 +1,53 @@
+package net.gepafin.tendermanagement.entities;
+
+import java.math.BigDecimal;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
+import lombok.Data;
+
+@Entity
+@Table(name = "COMPANY")
+@Data
+public class CompanyEntity extends BaseEntity{
+
+ @Column(name = "COMPANY_NAME")
+ private String companyName;
+
+ @Column(name = "VAT_NUMBER")
+ private String vatNumber;
+
+ @Column(name = "CODICE_FISCALE")
+ private String codiceFiscale;
+
+ @Column(name = "ADDRESS")
+ private String address;
+
+ @Column(name = "PHONE_NUMBER")
+ private String phoneNumber;
+
+ @Column(name = "CITY")
+ private String city;
+
+ @Column(name = "PROVINCE")
+ private String province;
+
+ @Column(name = "CAP")
+ private String cap;
+
+ @Column(name = "COUNTRY")
+ private String country;
+
+ @Column(name = "PEC")
+ private String pec;
+
+ @Column(name = "EMAIL")
+ private String email;
+
+ @Column(name = "NUMBER_OF_EMPLOYEES")
+ private String numberOfEmployees;
+
+ @Column(name = "ANNUAL_REVENUE")
+ private BigDecimal annualRevenue;
+}
diff --git a/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java
index 38cd3b2b..a476f2c5 100644
--- a/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java
+++ b/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java
@@ -41,6 +41,9 @@ public class FaqEntity extends BaseEntity {
@Column(name ="IS_DELETED", nullable = false)
private Boolean isDeleted = false;
+
+ @Column(name ="COMPANY_ID")
+ private Long companyId;
}
diff --git a/src/main/java/net/gepafin/tendermanagement/entities/SamlResponseEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/SamlResponseEntity.java
new file mode 100644
index 00000000..732edfd9
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/entities/SamlResponseEntity.java
@@ -0,0 +1,20 @@
+package net.gepafin.tendermanagement.entities;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
+import lombok.Data;
+
+@Entity
+@Table(name = "SAML_RESPONSE")
+@Data
+public class SamlResponseEntity extends BaseEntity{
+
+ @Column(name = "AUTHENTICATION_OBJECT")
+ private String authenticationObject;
+
+ @Column(name = "TOKEN")
+ private String token;
+
+
+}
diff --git a/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java
index 5bd88f33..f8d34ea2 100644
--- a/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java
+++ b/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java
@@ -1,6 +1,5 @@
package net.gepafin.tendermanagement.entities;
-import com.fasterxml.jackson.annotation.JsonValue;
import jakarta.persistence.*;
import jakarta.validation.constraints.Email;
@@ -17,7 +16,7 @@ import java.time.LocalDateTime;
@Setter
public class UserEntity extends BaseEntity {
- @Column(name = "PASSWORD", columnDefinition = "TEXT",nullable = false)
+ @Column(name = "PASSWORD", columnDefinition = "TEXT",nullable = true)
@JsonIgnore
private String password;
@@ -29,8 +28,7 @@ public class UserEntity extends BaseEntity {
@JoinColumn(name = "ROLE_ID")
@JsonIgnore
private RoleEntity roleEntity;
-
-
+
@Column(name = "LAST_LOGIN")
private LocalDateTime lastLogin;
@@ -60,4 +58,11 @@ public class UserEntity extends BaseEntity {
@Column(name = "RESET_PASSWORD_TOKEN", length = 255, nullable = true)
private String resetPasswordToken;
+
+ @Column(name = "DATE_OF_BIRTH")
+ private LocalDateTime dateOfBirth;
+
+ @OneToOne
+ @JoinColumn(name = "BENEFICIARY_ID")
+ private BeneficiaryEntity beneficiary;
}
diff --git a/src/main/java/net/gepafin/tendermanagement/entities/UserWithCompanyEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/UserWithCompanyEntity.java
new file mode 100644
index 00000000..fce47e66
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/entities/UserWithCompanyEntity.java
@@ -0,0 +1,22 @@
+package net.gepafin.tendermanagement.entities;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
+import lombok.Data;
+
+@Entity
+@Table(name = "USER_WITH_COMPANY")
+@Data
+public class UserWithCompanyEntity extends BaseEntity{
+
+ @Column(name = "USER_ID")
+ Long userId;
+
+ @Column(name = "BENEFICIARY_ID")
+ Long beneficiaryId;
+
+ @Column(name = "COMPANY_ID")
+ Long companyId;
+
+}
diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CompanyRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/CompanyRequest.java
new file mode 100644
index 00000000..bfd6829d
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/model/request/CompanyRequest.java
@@ -0,0 +1,24 @@
+package net.gepafin.tendermanagement.model.request;
+
+import java.math.BigDecimal;
+
+import lombok.Data;
+
+@Data
+public class CompanyRequest {
+
+ private String companyName;
+ private String vatNumber;
+ private String codiceFiscale;
+ private String address;
+ private String phoneNumber;
+ private String city;
+ private String province;
+ private String cap;
+ private String country;
+ private String pec;
+ private String email;
+ private String numberOfEmployees;
+ private BigDecimal annualRevenue;
+
+}
diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java
index bfa0e84d..bdc0d015 100644
--- a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java
+++ b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java
@@ -2,7 +2,9 @@ package net.gepafin.tendermanagement.model.request;
import java.math.BigDecimal;
import java.time.LocalDateTime;
+import java.time.LocalTime;
import java.util.List;
+
import lombok.Data;
@Data
@@ -26,6 +28,16 @@ public class CreateCallRequestStep1 {
private String documentationRequested;
+ private BigDecimal amountMin;
+
+ private String email;
+
+ private String phoneNumber;
+
+ private String startTime;
+
+ private String endTime;
+
private Boolean confidi;
private List faq;
diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java
index 4d4de6e9..e57f8715 100644
--- a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java
+++ b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java
@@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.model.request;
import java.math.BigDecimal;
import java.time.LocalDateTime;
+import java.time.LocalTime;
import java.util.List;
import lombok.Data;
@@ -25,6 +26,16 @@ public class UpdateCallRequestStep1 {
private String documentationRequested;
+ private BigDecimal amountMin;
+
+ private String email;
+
+ private String phoneNumber;
+
+ private String startTime;
+
+ private String endTime;
+
private Boolean confidi;
private List faq;
diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java
index 7dacab15..c53d65aa 100644
--- a/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java
+++ b/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java
@@ -1,20 +1,15 @@
package net.gepafin.tendermanagement.model.request;
-import jakarta.validation.constraints.Email;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
+import java.time.LocalDateTime;
import lombok.Data;
@Data
public class UserReq {
- @NotBlank
- @Email
private String email;
- @NotEmpty
+
private String password;
- @NotEmpty
+
private String confPassword;
private String firstName;
@@ -22,7 +17,7 @@ public class UserReq {
private String lastName;
private String phoneNumber;
- @NotNull
+
private Long roleId;
private String organization;
@@ -32,5 +27,9 @@ public class UserReq {
private String city;
private String country;
+
+ private String codiceFiscale;
+
+ private LocalDateTime dateOfBirth;
}
diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationFormFieldResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationFormFieldResponseBean.java
index f625d991..2e207f21 100644
--- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationFormFieldResponseBean.java
+++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationFormFieldResponseBean.java
@@ -12,5 +12,5 @@ public class ApplicationFormFieldResponseBean extends BaseBean {
private String fieldId;
- private String fieldValue;
+ private Object fieldValue;
}
diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationGetResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationGetResponseBean.java
index 50ce0c57..9078f3a2 100644
--- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationGetResponseBean.java
+++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationGetResponseBean.java
@@ -19,6 +19,10 @@ public class ApplicationGetResponseBean {
private Long callId;
private String callTitle;
+
+ private Long companyId;
+
+ private String companyName;
private List form;
diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java
index fdb0f6f3..4283637f 100644
--- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java
+++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java
@@ -13,10 +13,22 @@ public class ApplicationResponse{
private Long callId;
+ private String callTitle;
+
+ private LocalDateTime callEndDate;
+
+ private LocalDateTime modifiedDate;
+
+ private Integer progress;
+
private LocalDateTime submissionDate;
private String status;
private String comments;
+
+ private Long companyId;
+
+ private String companyName;
}
\ No newline at end of file
diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java
index a7bf60b7..51479254 100644
--- a/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java
+++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java
@@ -5,6 +5,7 @@ import net.gepafin.tendermanagement.enums.CallStatusEnum;
import java.math.BigDecimal;
import java.time.LocalDateTime;
+import java.time.LocalTime;
import java.util.List;
@Data
public class CallDetailsResponseBean {
@@ -37,6 +38,16 @@ public class CallDetailsResponseBean {
private String documentationRequested;
+ private BigDecimal amountMin;
+
+ private String email;
+
+ private String phoneNumber;
+
+ private LocalTime startTime;
+
+ private LocalTime endTime;
+
private LocalDateTime createdDate;
private LocalDateTime updatedDate;
diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java
index f8fa4908..ed4a0206 100644
--- a/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java
+++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java
@@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.model.response;
import java.math.BigDecimal;
import java.time.LocalDateTime;
+import java.time.LocalTime;
import java.util.List;
import lombok.Data;
@@ -40,6 +41,16 @@ public class CallResponse {
private Boolean confidi;
+ private BigDecimal amountMin;
+
+ private String email;
+
+ private String phoneNumber;
+
+ private LocalTime startTime;
+
+ private LocalTime endTime;
+
private LocalDateTime createdDate;
private LocalDateTime updatedDate;
diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CompanyResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/CompanyResponse.java
new file mode 100644
index 00000000..254d05a0
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/model/response/CompanyResponse.java
@@ -0,0 +1,25 @@
+package net.gepafin.tendermanagement.model.response;
+
+import java.math.BigDecimal;
+
+import lombok.Data;
+import net.gepafin.tendermanagement.model.BaseBean;
+
+@Data
+public class CompanyResponse extends BaseBean{
+
+ private String companyName;
+ private String vatNumber;
+ private String codiceFiscale;
+ private String address;
+ private String phoneNumber;
+ private String city;
+ private String province;
+ private String cap;
+ private String country;
+ private String pec;
+ private String email;
+ private String numberOfEmployees;
+ private BigDecimal annualRevenue;
+
+}
diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FlowResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/FlowResponseBean.java
index 289f44b1..d97895e7 100644
--- a/src/main/java/net/gepafin/tendermanagement/model/response/FlowResponseBean.java
+++ b/src/main/java/net/gepafin/tendermanagement/model/response/FlowResponseBean.java
@@ -1,6 +1,7 @@
package net.gepafin.tendermanagement.model.response;
import lombok.Data;
+import net.gepafin.tendermanagement.enums.CallStatusEnum;
import net.gepafin.tendermanagement.model.request.FlowDataRequestBean;
import net.gepafin.tendermanagement.model.request.FlowEdgesRequestBean;
@@ -11,6 +12,8 @@ public class FlowResponseBean {
private Long callId;
+ private CallStatusEnum callStatus;
+
private Long initialForm;
private Long finalForm;
diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java
index 7e3ebce1..7a1d178e 100644
--- a/src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java
+++ b/src/main/java/net/gepafin/tendermanagement/model/response/FormResponseBean.java
@@ -9,6 +9,8 @@ public class FormResponseBean {
private Long id;
+ private String callStatus;
+
private String label;
private Long callId;
diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/LoginResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/LoginResponse.java
index 64af6b1a..d9cf63e9 100644
--- a/src/main/java/net/gepafin/tendermanagement/model/response/LoginResponse.java
+++ b/src/main/java/net/gepafin/tendermanagement/model/response/LoginResponse.java
@@ -6,6 +6,7 @@ import lombok.NoArgsConstructor;
import lombok.Setter;
import java.time.LocalDateTime;
+import java.util.List;
@Getter
@Setter
@@ -35,8 +36,14 @@ public class LoginResponse {
private String status;
private LocalDateTime lastLogin;
+
+ private String codiceFiscale;
+
+ private LocalDateTime dateOfBirth;
private LocalDateTime createdDate;
private LocalDateTime updatedDate;
+
+ private List companies;
}
diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java
index 55ee34be..7864e831 100644
--- a/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java
+++ b/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java
@@ -1,6 +1,7 @@
package net.gepafin.tendermanagement.model.response;
import lombok.Data;
+import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum;
@Data
public class NextOrPreviousFormResponse {
@@ -17,6 +18,12 @@ public class NextOrPreviousFormResponse {
private Long currentStep;
+ private Long companyId;
+
+ private String companyName;
+
+ private ApplicationStatusTypeEnum applicationStatus;
+
private FormApplicationResponse applicationFormResponse;
}
\ No newline at end of file
diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java
index 5c1a8ef2..c0457120 100644
--- a/src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java
+++ b/src/main/java/net/gepafin/tendermanagement/model/response/UserResponseBean.java
@@ -6,6 +6,7 @@ import net.gepafin.tendermanagement.enums.UserStatusEnum;
import net.gepafin.tendermanagement.model.BaseBean;
import java.time.LocalDateTime;
+import java.util.List;
@Getter
@Setter
@@ -32,5 +33,10 @@ public class UserResponseBean extends BaseBean {
private UserStatusEnum status;
private LocalDateTime lastLogin;
+
+ private String codiceFiscale;
+
+ private LocalDateTime dateOfBirth;
+ private List companies;
}
diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/UserSamlResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/UserSamlResponse.java
new file mode 100644
index 00000000..da732bd4
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/model/response/UserSamlResponse.java
@@ -0,0 +1,13 @@
+package net.gepafin.tendermanagement.model.response;
+
+import lombok.Data;
+
+@Data
+public class UserSamlResponse {
+
+ private String codiceFiscale;
+
+ private String firstName;
+
+ private String lastName;
+}
diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormRepository.java
index 992eece3..1037402a 100644
--- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormRepository.java
+++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormRepository.java
@@ -17,4 +17,5 @@ public interface ApplicationFormRepository extends JpaRepository findByApplicationIdOrderByCreatedDateAsc(Long applicationId);
+ public List findByFormIdInAndApplicationId(List formIds,Long applicationId);
}
diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java
index 8d41608c..567c8198 100644
--- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java
+++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java
@@ -3,6 +3,7 @@ package net.gepafin.tendermanagement.repositories;
import net.gepafin.tendermanagement.entities.ApplicationEntity;
import net.gepafin.tendermanagement.entities.FaqEntity;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@@ -11,9 +12,7 @@ import java.util.List;
import java.util.Optional;
@Repository
-public interface ApplicationRepository extends JpaRepository {
-
- public Optional findByUserIdAndCallIdAndIsDeletedFalse(Long userId,Long callId);
+public interface ApplicationRepository extends JpaRepository, JpaSpecificationExecutor {
public List findByUserIdAndIsDeletedFalse(Long userId);
@@ -23,4 +22,12 @@ public interface ApplicationRepository extends JpaRepository findByCallIdAndIsDeletedFalse(Long callId);
public List findByIsDeletedFalse();
+
+ public Optional findByIdAndUserIdAndIsDeletedFalse(Long id,Long userId);
+
+ Optional findByCompanyIdAndCallIdAndIsDeletedFalse(Long companyId, Long callId);
+
+ public Optional findByIdAndUserIdAndCallIdAndIsDeletedFalse(Long applicationId, Long userId,
+ Long callId);
+
}
diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/BeneficiaryRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/BeneficiaryRepository.java
new file mode 100644
index 00000000..ecb6ed7d
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/repositories/BeneficiaryRepository.java
@@ -0,0 +1,11 @@
+package net.gepafin.tendermanagement.repositories;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import net.gepafin.tendermanagement.entities.BeneficiaryEntity;
+
+@Repository
+public interface BeneficiaryRepository extends JpaRepository {
+
+}
diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CompanyRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CompanyRepository.java
new file mode 100644
index 00000000..9206826f
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/repositories/CompanyRepository.java
@@ -0,0 +1,18 @@
+package net.gepafin.tendermanagement.repositories;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import net.gepafin.tendermanagement.entities.CompanyEntity;
+
+@Repository
+public interface CompanyRepository extends JpaRepository {
+
+ List findByIdIn(List companyIds);
+
+ Boolean existsByVatNumber(String vatNumber);
+ CompanyEntity findByVatNumber(String vatNumber);
+
+}
diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/FormRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/FormRepository.java
index 6250b21b..db35477f 100644
--- a/src/main/java/net/gepafin/tendermanagement/repositories/FormRepository.java
+++ b/src/main/java/net/gepafin/tendermanagement/repositories/FormRepository.java
@@ -10,4 +10,6 @@ import java.util.List;
public interface FormRepository extends JpaRepository {
List findByCallId(Long callId);
+
+ List findByIdIn(List formId);
}
diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/RoleRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/RoleRepository.java
index e009e6a3..a48eade5 100644
--- a/src/main/java/net/gepafin/tendermanagement/repositories/RoleRepository.java
+++ b/src/main/java/net/gepafin/tendermanagement/repositories/RoleRepository.java
@@ -6,4 +6,6 @@ import org.springframework.stereotype.Repository;
@Repository
public interface RoleRepository extends JpaRepository {
+
+ RoleEntity findByRoleType(String roleType);
}
diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/SamlResponseRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/SamlResponseRepository.java
new file mode 100644
index 00000000..9183f339
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/repositories/SamlResponseRepository.java
@@ -0,0 +1,13 @@
+package net.gepafin.tendermanagement.repositories;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import net.gepafin.tendermanagement.entities.SamlResponseEntity;
+
+@Repository
+public interface SamlResponseRepository extends JpaRepository {
+
+ SamlResponseEntity findByToken(String token);
+
+}
diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java
index 7720430c..829cd7ef 100644
--- a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java
+++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java
@@ -2,11 +2,20 @@ package net.gepafin.tendermanagement.repositories;
import net.gepafin.tendermanagement.entities.UserEntity;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
import java.util.Optional;
+@Repository
public interface UserRepository extends JpaRepository {
+
Optional findByEmailIgnoreCase(String email);
+
boolean existsByEmailIgnoreCase(String email);
+
UserEntity findByEmail(String email);
+
+ Optional findByBeneficiaryCodiceFiscale(String codiceFiscale);
+
+ boolean existsByBeneficiaryCodiceFiscale(String codiceFiscale);
}
diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserWithCompanyRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserWithCompanyRepository.java
new file mode 100644
index 00000000..89da2436
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserWithCompanyRepository.java
@@ -0,0 +1,22 @@
+package net.gepafin.tendermanagement.repositories;
+
+import java.util.List;
+import java.util.Optional;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import net.gepafin.tendermanagement.entities.UserWithCompanyEntity;
+
+
+public interface UserWithCompanyRepository extends JpaRepository {
+
+ void deleteByCompanyId(Long companyId);
+
+ @Query("SELECT uwc.companyId FROM UserWithCompanyEntity uwc WHERE uwc.userId = :userId")
+ List findCompanyIdByUserId(@Param("userId") Long userId);
+
+ Optional findByUserIdAndCompanyId(Long userId, Long companyId);
+
+}
diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java
index 152bc1b5..a8f6ad53 100644
--- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java
+++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java
@@ -19,15 +19,16 @@ public interface ApplicationService {
ApplicationGetResponseBean getApplicationByFormId(HttpServletRequest request, Long applicationId,Long formId);
- List getAllApplications(HttpServletRequest request,Long callId);
+ List getAllApplications(HttpServletRequest request,Long callId, Long companyId);
void deleteApplication(HttpServletRequest request, Long applicationId);
public ApplicationEntity validateApplication(Long userId);
- public ApplicationResponse createApplication(HttpServletRequest request, ApplicationRequest applicationRequest, Long callId);
+ public ApplicationResponse createApplication(HttpServletRequest request, Long companyId, ApplicationRequest applicationRequest, Long callId);
public NextOrPreviousFormResponse getNextOrPreviousForm(HttpServletRequest request, Long applicationId, Long formId, FormActionEnum action);
public void updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status);
+
}
diff --git a/src/main/java/net/gepafin/tendermanagement/service/CompanyService.java b/src/main/java/net/gepafin/tendermanagement/service/CompanyService.java
new file mode 100644
index 00000000..d0d7ce20
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/service/CompanyService.java
@@ -0,0 +1,30 @@
+package net.gepafin.tendermanagement.service;
+
+import java.util.List;
+import java.util.Map;
+
+import jakarta.servlet.http.HttpServletRequest;
+import net.gepafin.tendermanagement.entities.CompanyEntity;
+import net.gepafin.tendermanagement.entities.UserWithCompanyEntity;
+import net.gepafin.tendermanagement.model.request.CompanyRequest;
+import net.gepafin.tendermanagement.model.response.CompanyResponse;
+
+public interface CompanyService {
+
+ CompanyResponse createCompany(HttpServletRequest request, CompanyRequest companyRequest);
+
+ CompanyResponse updateCompany(HttpServletRequest request, Long companyId, CompanyRequest companyRequest);
+
+ CompanyResponse getCompany(HttpServletRequest request, Long companyId);
+
+ void deleteCompany(HttpServletRequest request, Long companyId);
+
+ List getCompanyByUserId(HttpServletRequest request, Long userId);
+
+ Map checkVatNumber(HttpServletRequest request, String vatNumber);
+
+ CompanyEntity validateCompany(Long companyId);
+
+ UserWithCompanyEntity validateUserWithCompny(Long userId, Long companyId);
+
+}
diff --git a/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java b/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java
index 4c57d3ca..6012a273 100644
--- a/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java
+++ b/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java
@@ -1,6 +1,7 @@
package net.gepafin.tendermanagement.service;
import jakarta.servlet.http.HttpServletRequest;
+import net.gepafin.tendermanagement.entities.DocumentEntity;
import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum;
import net.gepafin.tendermanagement.enums.DocumentTypeEnum;
import net.gepafin.tendermanagement.model.response.DocumentResponseBean;
@@ -17,4 +18,6 @@ public interface DocumentService {
public DocumentResponseBean updateDocument(HttpServletRequest httpServletRequest, Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum);
public DocumentResponseBean getDocument(HttpServletRequest httpServletRequest,Long documentId);
-}
+
+ public DocumentEntity validateDocument(Long id);
+ }
diff --git a/src/main/java/net/gepafin/tendermanagement/service/FaqService.java b/src/main/java/net/gepafin/tendermanagement/service/FaqService.java
index 55adc950..74fd414d 100644
--- a/src/main/java/net/gepafin/tendermanagement/service/FaqService.java
+++ b/src/main/java/net/gepafin/tendermanagement/service/FaqService.java
@@ -11,7 +11,7 @@ import net.gepafin.tendermanagement.model.response.FaqResponseBean;
public interface FaqService {
- FaqResponseBean createFaq(HttpServletRequest request,Long callId, FaqReq faqRequest);
+ FaqResponseBean createFaq(HttpServletRequest request,Long callId, Long companyId, FaqReq faqRequest);
FaqResponseBean getFaqById(HttpServletRequest request, Long id);
diff --git a/src/main/java/net/gepafin/tendermanagement/service/UserService.java b/src/main/java/net/gepafin/tendermanagement/service/UserService.java
index f925d7dd..57421978 100644
--- a/src/main/java/net/gepafin/tendermanagement/service/UserService.java
+++ b/src/main/java/net/gepafin/tendermanagement/service/UserService.java
@@ -8,11 +8,12 @@ import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import net.gepafin.tendermanagement.enums.UserStatusEnum;
import net.gepafin.tendermanagement.model.request.*;
+import net.gepafin.tendermanagement.model.response.UserSamlResponse;
import net.gepafin.tendermanagement.model.response.UserResponseBean;
import net.gepafin.tendermanagement.model.util.JWTToken;
public interface UserService {
- UserResponseBean createUser(UserReq userReq);
+ JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq);
UserResponseBean updateUser(Long userId, UpdateUserReq userReq);
@@ -35,4 +36,8 @@ public interface UserService {
UserResponseBean updateUserStatus(Long userId, UserStatusEnum statusReq);
UserResponseBean getValidUser(HttpServletRequest request);
+
+ JWTToken validateExistingUserToken(HttpServletRequest request, String token);
+
+ UserSamlResponse validateNewUserToken(HttpServletRequest request, String token);
}
diff --git a/src/main/java/net/gepafin/tendermanagement/service/feignClient/VatCheckService.java b/src/main/java/net/gepafin/tendermanagement/service/feignClient/VatCheckService.java
index 6665690d..333ab3a1 100644
--- a/src/main/java/net/gepafin/tendermanagement/service/feignClient/VatCheckService.java
+++ b/src/main/java/net/gepafin/tendermanagement/service/feignClient/VatCheckService.java
@@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.RequestHeader;
import java.net.URI;
import java.util.Map;
-@FeignClient(value = "vat-check-service", url = GepafinConstant.VATNUMBER_V2)
+@FeignClient(value = "vat-check-service", url = GepafinConstant.CHECK_VATNUMBER_V2_NEW_URL)
public interface VatCheckService {
diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java
index e2364698..a64afadf 100644
--- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java
+++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java
@@ -4,6 +4,7 @@ import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.dao.ApplicationDao;
import net.gepafin.tendermanagement.dao.FlowFormDao;
import net.gepafin.tendermanagement.entities.ApplicationEntity;
+import net.gepafin.tendermanagement.entities.CompanyEntity;
import net.gepafin.tendermanagement.entities.UserEntity;
import net.gepafin.tendermanagement.model.request.ApplicationRequest;
import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum;
@@ -35,10 +36,11 @@ public class ApplicationServiceImpl implements ApplicationService {
@Override
@Transactional(rollbackFor = Exception.class)
- public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean,Long applicationId, Long formId) {
- UserEntity userEntity = validator.validateUser(request);
- return applicationDao.createApplication(applicationRequestBean,userEntity,formId,applicationId);
- }
+ public ApplicationResponseBean createApplication(HttpServletRequest request,
+ ApplicationRequestBean applicationRequestBean, Long applicationId, Long formId) {
+ UserEntity userEntity = validator.validateUser(request);
+ return applicationDao.createApplication(applicationRequestBean, userEntity, formId, applicationId);
+ }
@Override
@Transactional(readOnly = true)
@@ -60,9 +62,10 @@ public class ApplicationServiceImpl implements ApplicationService {
@Override
@Transactional(rollbackFor = Exception.class)
- public ApplicationResponse createApplication(HttpServletRequest request, ApplicationRequest applicationRequest, Long callId) {
+ public ApplicationResponse createApplication(HttpServletRequest request, Long companyId, ApplicationRequest applicationRequest, Long callId) {
UserEntity userEntity = validator.validateUser(request);
- return applicationDao.createApplicationByCallId(applicationRequest,callId,userEntity);
+ CompanyEntity companyEntity = validator.validateUSerWithCompany(request, companyId);
+ return applicationDao.createApplicationByCallId(companyEntity, applicationRequest, callId, userEntity);
}
@Override
@@ -80,8 +83,11 @@ public class ApplicationServiceImpl implements ApplicationService {
@Override
@Transactional(readOnly = true)
- public List getAllApplications(HttpServletRequest request,Long callId) {
- UserEntity userEntity = validator.validateUser(request);
- return applicationDao.getAllApplications(userEntity,callId);
- }
+ public List getAllApplications(HttpServletRequest request, Long callId, Long companyId) {
+ UserEntity userEntity = validator.validateUser(request);
+ if (companyId != null) {
+ validator.validateUSerWithCompany(request, companyId);
+ }
+ return applicationDao.getAllApplications(userEntity, callId, companyId);
+ }
}
diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java
index bf853124..a84b325c 100644
--- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java
+++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java
@@ -5,16 +5,23 @@ import jakarta.servlet.http.HttpServletResponse;
import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.config.jwt.TokenProvider;
import net.gepafin.tendermanagement.constants.GepafinConstant;
+import net.gepafin.tendermanagement.dao.CompanyDao;
import net.gepafin.tendermanagement.dao.RoleDao;
+import net.gepafin.tendermanagement.entities.SamlResponseEntity;
import net.gepafin.tendermanagement.entities.UserEntity;
import net.gepafin.tendermanagement.enums.UserStatusEnum;
import net.gepafin.tendermanagement.model.request.LoginReq;
+import net.gepafin.tendermanagement.model.response.CompanyResponse;
import net.gepafin.tendermanagement.model.response.LoginResponse;
import net.gepafin.tendermanagement.model.response.RoleResponseBean;
+import net.gepafin.tendermanagement.model.response.UserSamlResponse;
import net.gepafin.tendermanagement.model.util.JWTToken;
+import net.gepafin.tendermanagement.repositories.SamlResponseRepository;
import net.gepafin.tendermanagement.repositories.UserRepository;
import net.gepafin.tendermanagement.util.DateTimeUtil;
+import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
+import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException;
import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -27,6 +34,8 @@ import org.springframework.security.web.authentication.logout.SecurityContextLog
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
@Service
public class AuthenticationService {
@@ -35,6 +44,8 @@ public class AuthenticationService {
private final TokenProvider tokenProvider;
private final AuthenticationManager authenticationManager;
+ @Autowired
+ private CompanyDao companyDao;
@Autowired
private UserRepository userRepository;
@@ -42,6 +53,9 @@ public class AuthenticationService {
@Autowired
private RoleDao roleDao;
+ @Autowired
+ private SamlResponseRepository samlResponseLogRepository;
+
@Autowired
public AuthenticationService(TokenProvider tokenProvider, AuthenticationManager authenticationManager) {
this.tokenProvider = tokenProvider;
@@ -55,46 +69,67 @@ public class AuthenticationService {
Authentication authentication = this.authenticationManager.authenticate(authenticationToken);
SecurityContextHolder.getContext().setAuthentication(authentication);
log.info("Authentication successful for email: {}", loginReq.getEmail());
- UserEntity user = userRepository.findByEmailIgnoreCase(loginReq.getEmail()).orElseThrow(()-> new CustomValidationException(Status.NOT_FOUND,
- Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)));
- if (Boolean.FALSE.equals(UserStatusEnum.ACTIVE.getValue().equals(user.getStatus()))) {
- throw new CustomValidationException(Status.NOT_FOUND,
- Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG));
+ UserEntity user = userRepository.findByEmailIgnoreCase(loginReq.getEmail())
+ .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
+ Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)));
+ if (Boolean.FALSE.equals(UserStatusEnum.ACTIVE.getValue().equals(user.getStatus()))) {
+ throw new ResourceNotFoundException(Status.NOT_FOUND,
+ Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG));
}
+ return getJWTTokenBean(user, loginReq.getRememberMe());
+ }
+
+ public JWTToken getJWTTokenBean(UserEntity user, Boolean rememberMe) {
user.setLastLogin(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
userRepository.save(user);
- String token = tokenProvider.createToken(authentication, loginReq.getRememberMe(), user);
- log.info("JWT token generated for email: {}", loginReq.getEmail());
+ String token = tokenProvider.createToken(rememberMe, user);
+ log.info("JWT token generated for email: {}", user.getEmail());
RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(user.getRoleEntity());
LoginResponse loginResponse = getLoginResponse(user, roleResponseBean);
JWTToken jwtToken = new JWTToken(token, loginResponse);
- log.info("Login successful for email: {}", loginReq.getEmail());
- return jwtToken;
- }
-
- private static LoginResponse getLoginResponse(UserEntity user, RoleResponseBean roleResponseBean) {
- LoginResponse loginResponse = new LoginResponse();
- loginResponse.setId(user.getId());
- loginResponse.setEmail(user.getEmail());
- loginResponse.setFirstName(user.getFirstName());
- loginResponse.setLastName(user.getLastName());
- loginResponse.setRole(roleResponseBean);
- loginResponse.setPhoneNumber(user.getPhoneNumber());
- loginResponse.setAddress(user.getAddress());
- loginResponse.setOrganization(user.getOrganization());
- loginResponse.setCountry(user.getCountry());
- loginResponse.setStatus(user.getStatus());
- loginResponse.setCity(user.getCity());
- loginResponse.setLastLogin(user.getLastLogin());
+ log.info("Login successful for email: {}", user.getEmail());
+ return jwtToken;
+ }
+
+ private LoginResponse getLoginResponse(UserEntity user, RoleResponseBean roleResponseBean) {
+ LoginResponse loginResponse = new LoginResponse();
+ loginResponse.setEmail(user.getEmail());
+ loginResponse.setId(user.getId());
+ List companyResponseBeans = companyDao.getCompanyByUserId(user.getId());
+ loginResponse.setCompanies(companyResponseBeans);
+ loginResponse.setRole(roleResponseBean);
+ loginResponse.setStatus(user.getStatus());
+ loginResponse.setLastLogin(user.getLastLogin());
loginResponse.setCreatedDate(user.getCreatedDate());
loginResponse.setUpdatedDate(user.getUpdatedDate());
+ if (user.getBeneficiary() == null) {
+ loginResponse.setFirstName(user.getFirstName());
+ loginResponse.setLastName(user.getLastName());
+ loginResponse.setPhoneNumber(user.getPhoneNumber());
+ loginResponse.setAddress(user.getAddress());
+ loginResponse.setOrganization(user.getOrganization());
+ loginResponse.setCountry(user.getCountry());
+ loginResponse.setCity(user.getCity());
+ loginResponse.setDateOfBirth(user.getDateOfBirth());
+ }else {
+ loginResponse.setFirstName(user.getBeneficiary().getFirstName());
+ loginResponse.setLastName(user.getBeneficiary().getLastName());
+ loginResponse.setPhoneNumber(user.getBeneficiary().getPhoneNumber());
+ loginResponse.setAddress(user.getBeneficiary().getAddress());
+ loginResponse.setOrganization(user.getBeneficiary().getOrganization());
+ loginResponse.setCountry(user.getBeneficiary().getCountry());
+ loginResponse.setCity(user.getBeneficiary().getCity());
+ loginResponse.setCodiceFiscale(user.getBeneficiary().getCodiceFiscale());
+ loginResponse.setDateOfBirth(user.getBeneficiary().getDateOfBirth());
+ }
+
return loginResponse;
}
- public void logout(HttpServletRequest request, HttpServletResponse response)
- { Authentication auth = SecurityContextHolder.getContext().getAuthentication();
+ public void logout(HttpServletRequest request, HttpServletResponse response) {
+ Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null) {
String token = tokenProvider.extractTokenFromRequest(request);
tokenProvider.invalidateToken(token);
@@ -102,6 +137,53 @@ public class AuthenticationService {
}
SecurityContextHolder.getContext().setAuthentication(null);
SecurityContextHolder.clearContext();
-}
+ }
+
+ public JWTToken validateExistingUserToken(String token) {
+ SamlResponseEntity samlResponseLogEntity = samlResponseLogRepository.findByToken(token);
+ if (samlResponseLogEntity == null) {
+ log.info("Invalid spid login token : {}", token);
+ throw new CustomValidationException(Status.VALIDATION_ERROR,
+ Translator.toLocale(GepafinConstant.INVALID_TOKEN_MSG));
+ }
+ Map> userAttributes = Utils
+ .convertStringIntoMap(samlResponseLogEntity.getAuthenticationObject());
+ String cf = userAttributes.get("CodiceFiscale").get(0).toString();
+ UserEntity userEntity = userRepository.findByBeneficiaryCodiceFiscale(cf)
+ .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
+ Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)));
+ samlResponseLogRepository.delete(samlResponseLogEntity);
+
+ return getJWTTokenBean(userEntity, Boolean.TRUE);
+ }
+
+
+ public UserSamlResponse validateNewUserToken(String token) {
+ SamlResponseEntity samlResponseLogEntity = samlResponseLogRepository.findByToken(token);
+ if (samlResponseLogEntity == null) {
+ log.info("Invalid spid login token : {}", token);
+ throw new CustomValidationException(Status.VALIDATION_ERROR,
+ Translator.toLocale(GepafinConstant.INVALID_TOKEN_MSG));
+ }
+ Map> userAttributes = Utils
+ .convertStringIntoMap(samlResponseLogEntity.getAuthenticationObject());
+ String cf = userAttributes.get("CodiceFiscale").get(0).toString();
+ if (userRepository.existsByBeneficiaryCodiceFiscale(cf)) {
+ throw new ResourceNotFoundException(Status.NOT_FOUND,
+ Translator.toLocale(GepafinConstant.USER_ALREADY_EXIST_MSG));
+ }
+ UserSamlResponse userSamlResponse = new UserSamlResponse();
+ userSamlResponse.setCodiceFiscale(cf);
+ if (userAttributes.containsKey("nome") && userAttributes.get("nome") != null
+ && !userAttributes.get("nome").isEmpty()) {
+ userSamlResponse.setFirstName(userAttributes.get("nome").get(0).toString());
+ }
+ if (userAttributes.containsKey("cognome") && userAttributes.get("cognome") != null
+ && !userAttributes.get("cognome").isEmpty()) {
+ userSamlResponse.setLastName(userAttributes.get("cognome").get(0).toString());
+ }
+ userSamlResponse.setCodiceFiscale(cf);
+ return userSamlResponse;
+ }
}
diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java
index 715242f5..3c7091cf 100644
--- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java
+++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java
@@ -10,6 +10,7 @@ import net.gepafin.tendermanagement.model.response.CallResponse;
import net.gepafin.tendermanagement.model.response.FlowResponseBean;
import net.gepafin.tendermanagement.model.response.FormResponseBean;
import net.gepafin.tendermanagement.util.FieldValidator;
+import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
import net.gepafin.tendermanagement.web.rest.api.errors.Status;
@@ -28,6 +29,10 @@ public class CallValidatorServiceImpl {
.notNull(response.getAmount(), "amount")
.notNull(response.getAmountMax(), "amountMax")
.notNull(response.getThreshold(), "threshold")
+ .notNull(response.getEmail(),"email")
+ .notNull(response.getAmountMin(),"amountMin")
+ .notNull(response.getStartTime(),"startTime")
+ .notNull(response.getEndTime(),"endTime")
.notNull(response.getDocumentationRequested(), "documentationRequested")
.notEmpty(response.getAimedTo(), "aimedTo")
.notEmpty(response.getCriteria(), "criteria")
diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java
new file mode 100644
index 00000000..6dfec87a
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java
@@ -0,0 +1,83 @@
+package net.gepafin.tendermanagement.service.impl;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.servlet.http.HttpServletRequest;
+import net.gepafin.tendermanagement.dao.CompanyDao;
+import net.gepafin.tendermanagement.dao.VatCheckDao;
+import net.gepafin.tendermanagement.entities.CompanyEntity;
+import net.gepafin.tendermanagement.entities.UserEntity;
+import net.gepafin.tendermanagement.entities.UserWithCompanyEntity;
+import net.gepafin.tendermanagement.model.request.CompanyRequest;
+import net.gepafin.tendermanagement.model.response.CompanyResponse;
+import net.gepafin.tendermanagement.service.CompanyService;
+import net.gepafin.tendermanagement.util.Validator;
+
+@Service
+public class CompanyServiceImpl implements CompanyService {
+
+ @Autowired
+ private Validator validator;
+
+ @Autowired
+ private CompanyDao companyDao;
+
+ @Autowired
+ private VatCheckDao vatCheckDao;
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public CompanyResponse createCompany(HttpServletRequest request, CompanyRequest companyRequest) {
+ UserEntity userEntity =validator.validateUser(request);
+ return companyDao.createCompany(userEntity, companyRequest);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public CompanyResponse updateCompany(HttpServletRequest request, Long companyId, CompanyRequest companyRequest) {
+ UserEntity userEntity =validator.validateUser(request);
+ return companyDao.updateCompany(userEntity, companyId, companyRequest);
+ }
+
+ @Override
+ @Transactional(readOnly = true)
+ public CompanyResponse getCompany(HttpServletRequest request, Long companyId) {
+ UserEntity userEntity =validator.validateUser(request);
+ return companyDao.getCompany(userEntity, companyId);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void deleteCompany(HttpServletRequest request, Long companyId) {
+ UserEntity userEntity =validator.validateUser(request);
+ companyDao.deleteCompany(userEntity, companyId);
+ }
+
+ @Override
+ @Transactional(readOnly = true)
+ public List getCompanyByUserId(HttpServletRequest request, Long userId) {
+ UserEntity userEntity = validator.validateUser(request);
+ return companyDao.getCompanyByUserId(userId);
+ }
+
+ @Override
+ @Transactional(readOnly = true)
+ public Map checkVatNumber(HttpServletRequest request, String vatNumber) {
+ return vatCheckDao.checkVatNumber(vatNumber);
+ }
+ @Override
+ public CompanyEntity validateCompany(Long companyId) {
+ return companyDao.validateCompany(companyId);
+ }
+
+ @Override
+ public UserWithCompanyEntity validateUserWithCompny(Long userId, Long companyId) {
+ return companyDao.validateUserWithCompny(userId, companyId);
+ }
+
+}
diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java
index 5cbc8634..3b3fa310 100644
--- a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java
+++ b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java
@@ -4,6 +4,7 @@ import java.util.List;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.dao.DocumentDao;
+import net.gepafin.tendermanagement.entities.DocumentEntity;
import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum;
import net.gepafin.tendermanagement.enums.DocumentTypeEnum;
import net.gepafin.tendermanagement.model.response.DocumentResponseBean;
@@ -40,4 +41,10 @@ public class DocumentServiceImpl implements DocumentService {
public DocumentResponseBean getDocument(HttpServletRequest httpServletRequest, Long documentId) {
return documentDao.getDocument(documentId);
}
+
+ @Override
+ public DocumentEntity validateDocument(Long id){
+ return documentDao.validateDocument(id);
+ }
+
}
diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/FaqServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/FaqServiceImpl.java
index 78a458f3..921b0ae7 100644
--- a/src/main/java/net/gepafin/tendermanagement/service/impl/FaqServiceImpl.java
+++ b/src/main/java/net/gepafin/tendermanagement/service/impl/FaqServiceImpl.java
@@ -25,9 +25,9 @@ public class FaqServiceImpl implements FaqService {
private Validator validator;
@Override
- public FaqResponseBean createFaq(HttpServletRequest request,Long callId, FaqReq faqRequest) {
+ public FaqResponseBean createFaq(HttpServletRequest request,Long callId, Long companyId, FaqReq faqRequest) {
UserEntity userEntity = validator.validateUser(request);
- return faqDao.createFaq(faqRequest, userEntity,callId);
+ return faqDao.createFaq(faqRequest, userEntity, callId, companyId);
}
@Override
diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java
index 9dc8378e..74ceaf40 100644
--- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java
+++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java
@@ -2,22 +2,25 @@ package net.gepafin.tendermanagement.service.impl;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
-import net.gepafin.tendermanagement.config.jwt.TokenProvider;
+import net.gepafin.tendermanagement.config.SamlSuccessHandler;
import net.gepafin.tendermanagement.dao.UserDao;
import net.gepafin.tendermanagement.entities.UserEntity;
import net.gepafin.tendermanagement.model.request.LoginReq;
import net.gepafin.tendermanagement.model.request.UpdateUserReq;
import net.gepafin.tendermanagement.model.request.UserReq;
+import net.gepafin.tendermanagement.enums.RoleStatusEnum;
import net.gepafin.tendermanagement.enums.UserStatusEnum;
import net.gepafin.tendermanagement.model.request.*;
+import net.gepafin.tendermanagement.model.response.UserSamlResponse;
import net.gepafin.tendermanagement.model.response.UserResponseBean;
import net.gepafin.tendermanagement.model.util.JWTToken;
import net.gepafin.tendermanagement.service.UserService;
+import net.gepafin.tendermanagement.util.Validator;
+
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import java.util.Map;
@Service
@@ -25,12 +28,22 @@ public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
+
@Autowired
- private TokenProvider tokenProvider;
+ private Validator validator;
+
+ @Autowired
+ private SamlSuccessHandler samlSuccessHandler;
+ @Override
@Transactional(rollbackFor = Exception.class)
- public UserResponseBean createUser(UserReq userReq) {
- return userDao.createUser(userReq);
+ public JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq) {
+ if (tempToken == null) {
+ validator.validateRequest(request,RoleStatusEnum.ROLE_SUPER_ADMIN);
+ }else {
+ samlSuccessHandler.validateToken(tempToken, userReq.getCodiceFiscale());
+ }
+ return userDao.createUser(request, tempToken, userReq);
}
@@ -89,8 +102,17 @@ public class UserServiceImpl implements UserService {
@Override
@Transactional(readOnly = true)
public UserResponseBean getValidUser(HttpServletRequest request) {
- Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request);
- UserEntity user=tokenProvider.validateUser(userInfo);
+ UserEntity user=validator.validateUser(request);
return userDao.getUserById(user.getId());
}
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public JWTToken validateExistingUserToken(HttpServletRequest request, String token) {
+ return userDao.validateExistingUserToken(token);
+ }
+ @Override
+ public UserSamlResponse validateNewUserToken(HttpServletRequest request, String token) {
+ return userDao.validateNewUserToken(token);
+ }
}
\ No newline at end of file
diff --git a/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java b/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java
index ab67ccdd..63ed91a5 100644
--- a/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java
+++ b/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java
@@ -1,16 +1,29 @@
package net.gepafin.tendermanagement.util;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
+import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import org.springframework.stereotype.Component;
+import java.io.IOException;
import java.time.LocalDateTime;
+import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
import java.util.Calendar;
import java.util.Date;
+import java.util.regex.Pattern;
@Component
public class DateTimeUtil {
-
+
+ private static final Pattern TIME_PATTERN = Pattern.compile(
+ "^((([01]?\\d|2[0-3]):([0-5]\\d)(:[0-5]\\d)?(\\s?[AP]M)?)|((0?[1-9]|1[0-2]):([0-5]\\d)(:[0-5]\\d)?\\s?[AP]M))$");
+
public static LocalDateTime DateServerToUTC(LocalDateTime systemDate) {
@@ -50,4 +63,27 @@ public class DateTimeUtil {
.from(localDateTime.atZone(ZoneId.systemDefault())
.toInstant());
}
+
+ public static LocalTime parseTime(String timeString) throws DateTimeParseException {
+ DateTimeFormatter formatter;
+ if(timeString==null) {
+ return null;
+ }
+ if (!TIME_PATTERN.matcher(timeString).matches()) {
+ throw new CustomValidationException(Status.BAD_REQUEST,"Invalid time format: " + timeString);
+ }
+ // Try to parse using default formats if no format is provided
+ String[] defaultFormats = {"HH:mm:ss", "HH:mm", "HH:mm:ss a", "hh:mm a"};
+ for (String defaultFormat : defaultFormats) {
+ formatter = DateTimeFormatter.ofPattern(defaultFormat);
+ try {
+ return LocalTime.parse(timeString, formatter);
+ } catch (DateTimeParseException e) {
+ // Continue to the next format
+ }
+ }
+
+ // If all parsing attempts fail, throw an exception
+ throw new CustomValidationException(Status.BAD_REQUEST,"Failed to parse time: " + timeString);
+ }
}
diff --git a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java
index 71c76f1a..26edffff 100644
--- a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java
+++ b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java
@@ -27,16 +27,16 @@ public class FieldValidator {
private VatCheckDao vatCheckDao;
- public FieldValidator notNull(Object object, String fieldName) {
+ public FieldValidator notNull(Object object, String fieldLabel) {
if (Objects.isNull(object)) {
- errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.FIELD_NOT_NULL), fieldName));
+ errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.FIELD_NOT_NULL), fieldLabel));
}
return this;
}
- public FieldValidator notEmpty(List> list, String fieldName) {
+ public FieldValidator notEmpty(List> list, String fieldLabel) {
if (list == null || list.isEmpty()) {
- errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.FIELD_NOT_EMPTY), fieldName));
+ errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.FIELD_NOT_EMPTY), fieldLabel));
}
return this;
}
@@ -46,23 +46,23 @@ public class FieldValidator {
throw new ValidationException(Status.VALIDATION_ERROR, errors, Translator.toLocale(GepafinConstant.VALIDATION_MESSAGE));
}
}
- public FieldValidator minLength(String value, Long minLength, String fieldName) {
+ public FieldValidator minLength(String value, Long minLength, String fieldLabel) {
if (minLength != null && value != null && value.length() < minLength) {
- errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_MIN_LENGTH), fieldName, minLength));
+ errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_MIN_LENGTH), fieldLabel, minLength));
}
return this;
}
- public FieldValidator maxLength(String value, Long maxLength, String fieldName) {
+ public FieldValidator maxLength(String value, Long maxLength, String fieldLabel) {
if (maxLength != null && value != null && value.length() > maxLength) {
- errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_MAX_LENGTH), fieldName, maxLength));
+ errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_MAX_LENGTH), fieldLabel, maxLength));
}
return this;
}
- public FieldValidator matchesPattern(String value, String pattern, String fieldName) {
+ public FieldValidator matchesPattern(String value, String pattern, String fieldLabel) {
if (value != null && pattern != null && !value.matches(pattern)) {
- errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_PATTERN), fieldName));
+ errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_PATTERN), fieldLabel));
}
return this;
}
@@ -147,4 +147,7 @@ public class FieldValidator {
}
return this;
}
+ public boolean hasErrors() {
+ return !errors.isEmpty();
+ }
}
diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java
index 055fb8e8..af0bc684 100644
--- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java
+++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java
@@ -1,27 +1,37 @@
package net.gepafin.tendermanagement.util;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.core.json.JsonReadFeature;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.type.TypeFactory;
-import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
-import io.micrometer.common.util.StringUtils;
-import org.apache.commons.collections4.MapUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;
+import java.security.SecureRandom;
import java.util.Base64;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Supplier;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
+import org.apache.commons.collections4.MapUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.json.JsonReadFeature;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.type.TypeFactory;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+
+import feign.FeignException;
+import io.micrometer.common.util.StringUtils;
+import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientForbiddenException;
+import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientNotFoundException;
+import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientUnauthorizedException;
+import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientValidationException;
+
public class Utils {
@@ -161,4 +171,60 @@ public class Utils {
}
}
}
+
+ public static String encodeData(String data) {
+ return Base64.getEncoder().encodeToString(data.getBytes(StandardCharsets.UTF_8));
+ }
+
+ public static String decodeData(String token) {
+ byte[] decodedBytes = Base64.getDecoder().decode(token);
+ return new String(decodedBytes, StandardCharsets.UTF_8);
+ }
+
+ public static String generateSecureToken() {
+ SecureRandom secureRandom = new SecureRandom();
+ byte[] tokenBytes = new byte[24];
+ secureRandom.nextBytes(tokenBytes);
+ String token = Base64.getUrlEncoder().withoutPadding().encodeToString(tokenBytes);
+ log.debug("Generated secure token: {}", token);
+ return token;
+ }
+
+ public static Map> convertStringIntoMap(String jsonString) {
+ try {
+ return mapper.readValue(jsonString, new TypeReference