diff --git a/pom.xml b/pom.xml index 29ebc22..aba3cfa 100644 --- a/pom.xml +++ b/pom.xml @@ -18,8 +18,8 @@ com.oracle.database.jdbc - ojdbc10 - 19.8.0.0 + ojdbc8 + 18.3.0.0 @@ -44,7 +44,7 @@ javax.servlet javax.servlet-api - 4.0.1 + 4.0.1 provided @@ -52,9 +52,39 @@ com.fasterxml.jackson.core jackson-databind - 2.13.0 + 2.13.0 + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + 2.13.0 + + + org.glassfish.jersey.media + jersey-media-json-jackson + 2.13 + + + ch.qos.logback + logback-core + 1.3.0 + + + + + ch.qos.logback + logback-classic + 1.3.0 + + + + + org.slf4j + slf4j-api + 2.0.9 + diff --git a/src/main/java/com/example/CorsFilters.java b/src/main/java/com/example/CorsFilters.java index 853eaa7..a8eb9e1 100644 --- a/src/main/java/com/example/CorsFilters.java +++ b/src/main/java/com/example/CorsFilters.java @@ -27,6 +27,7 @@ public class CorsFilters implements Filter { // Autoriser les en-têtes spécifiés dans la requête httpResponse.setHeader("Access-Control-Allow-Headers", "Content-Type"); + httpResponse.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"); // Permettre l'envoi de cookies (si nécessaire) httpResponse.setHeader("Access-Control-Allow-Credentials", "true"); diff --git a/src/main/java/com/example/services/AuthService.java b/src/main/java/com/example/services/AuthService.java new file mode 100644 index 0000000..40f4ac1 --- /dev/null +++ b/src/main/java/com/example/services/AuthService.java @@ -0,0 +1,144 @@ +package com.example.services; + +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import java.util.Arrays; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Path("/auth") +public class AuthService { + private static final Logger logger = LoggerFactory.getLogger(AuthService.class); + + public class UserAbilityRules { + private List rules; + + public UserAbilityRules() { + this.rules = Arrays.asList("admin", "editor"); + } + + public List getRules() { + return rules; + } + } + + public class UserData { + private int id; + private String fullName; + private String username; + private String avatar; + private String email; + private String role; + + public UserData() { + this.id = 1; + this.fullName = "Frédérik Benoist"; + this.username = "fbenoist"; + this.avatar = "/images/avatars/avatar-1.png"; + this.email = "admin@demo.com"; + this.role = "admin"; + } + + public int getId() { + return id; + } + + public String getFullName() { + return fullName; + } + + public String getUsername() { + return username; + } + + public String getAvatar() { + return avatar; + } + + public String getEmail() { + return email; + } + + public String getRole() { + return role; + } + } + + public class AuthResponse { + private String accessToken; + private UserAbilityRules userAbilityRules; + private UserData userData; + + public AuthResponse() { + this.accessToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MX0.fhc3wykrAnRpcKApKhXiahxaOe8PSHatad31NuIZ0Zg"; + this.userAbilityRules = new UserAbilityRules(); + this.userData = new UserData(); + } + + public String getAccessToken() { + return accessToken; + } + + public UserAbilityRules getUserAbilityRules() { + return userAbilityRules; + } + + public UserData getUserData() { + return userData; + } + } + + @POST + @Path("/login") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public AuthResponse login(Credentials credentials) { + logger.info(credentials.getUsername() + " is attempting to login"); + + if (!isValidPassword(credentials.getPassword())) { + logger.info("User " + credentials.getUsername() + " failed to login"); + throw new WebApplicationException("Invalid password", Response.Status.UNAUTHORIZED); + } + + logger.info("User " + credentials.getUsername() + " successfully logged in"); + + return new AuthResponse(); + } + + private boolean isValidPassword(String password) { + return "admin123".equals(password) || "support123".equals(password); + } + + public static class Credentials { + private String username; + private String password; + + // Getter pour username + public String getUsername() { + return username; + } + + // Setter pour username + public void setUsername(String username) { + this.username = username; + } + + // Getter pour password + public String getPassword() { + return password; + } + + // Setter pour password + public void setPassword(String password) { + this.password = password; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/example/services/DatabaseConnectDOTSOFT.java b/src/main/java/com/example/services/DatabaseConnectDOTSOFT.java new file mode 100644 index 0000000..67eb675 --- /dev/null +++ b/src/main/java/com/example/services/DatabaseConnectDOTSOFT.java @@ -0,0 +1,68 @@ +package com.example.services; + +import java.io.IOException; +import java.io.InputStream; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.Properties; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DatabaseConnectDOTSOFT implements AutoCloseable { + private static final Logger logger = LoggerFactory.getLogger(DatabaseConnectDOTSOFT.class); + + private Connection connection; + + public DatabaseConnectDOTSOFT(String username) throws SQLException { + String environment = loadEnvironment(); + + try { + Properties dbProperties = loadDatabaseProperties(); + + String url = dbProperties.getProperty(environment + ".db.url"); + String userpassword = dbProperties.getProperty(environment + ".db." + username + ".password"); + + connection = DriverManager.getConnection(url, username, userpassword); + + logger.info("DOTSOFT Connection OK for user " + username + " on environment " + environment); + } catch (SQLException e) { + logger.error("Failed to connect to DOTSOFT database for user " + username + " on environment " + environment, e); + throw e; // re-throw the exception + } + } + + public Connection getConnection() { + return connection; + } + + @Override + public void close() throws SQLException { + if (connection != null && !connection.isClosed()) { + connection.close(); + logger.info("DOTSOFT Connection closed"); + } + } + + private String loadEnvironment() { + Properties envProperties = loadProperties("env.properties"); + return envProperties.getProperty("environment"); + } + + private Properties loadDatabaseProperties() { + Properties dbProperties = loadProperties("db.properties"); + return dbProperties; + } + + private Properties loadProperties(String fileName) { + Properties properties = new Properties(); + try (InputStream input = getClass().getClassLoader().getResourceAsStream(fileName)) { + properties.load(input); + } catch (IOException e) { + e.printStackTrace(); + // Handle the exception correctly for your application + } + return properties; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/services/DatabaseConnectXADMIN.java b/src/main/java/com/example/services/DatabaseConnectXADMIN.java new file mode 100644 index 0000000..d7f68b7 --- /dev/null +++ b/src/main/java/com/example/services/DatabaseConnectXADMIN.java @@ -0,0 +1,61 @@ +package com.example.services; + +import java.io.IOException; +import java.io.InputStream; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.Properties; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DatabaseConnectXADMIN implements AutoCloseable { + private static final Logger logger = LoggerFactory.getLogger(DatabaseConnectXADMIN.class); + + private Connection connection; + + public DatabaseConnectXADMIN(String username) throws SQLException { + try { + Properties dbProperties = loadDatabaseProperties(); + + String url = dbProperties.getProperty("xadmin.db.url"); + String userpassword = dbProperties.getProperty("xadmin.db." + username + ".password"); + + connection = DriverManager.getConnection(url, username, userpassword); + + logger.info("XADMIN Connection OK for user " + username); + } catch (SQLException e) { + logger.error("Failed to connect to XADMIN database for user " + username, e); + throw e; // re-throw the exception + } + } + + public Connection getConnection() { + return connection; + } + + @Override + public void close() throws SQLException { + if (connection != null && !connection.isClosed()) { + connection.close(); + logger.info("XADMIN Connection closed"); + } + } + + private Properties loadDatabaseProperties() { + Properties dbProperties = loadProperties("db.properties"); + return dbProperties; + } + + private Properties loadProperties(String fileName) { + Properties properties = new Properties(); + try (InputStream input = getClass().getClassLoader().getResourceAsStream(fileName)) { + properties.load(input); + } catch (IOException e) { + e.printStackTrace(); + // Handle the exception correctly for your application + } + return properties; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/services/DatabaseConnectXSTORE.java b/src/main/java/com/example/services/DatabaseConnectXSTORE.java new file mode 100644 index 0000000..91fa3da --- /dev/null +++ b/src/main/java/com/example/services/DatabaseConnectXSTORE.java @@ -0,0 +1,61 @@ +package com.example.services; + +import java.io.IOException; +import java.io.InputStream; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.Properties; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DatabaseConnectXSTORE implements AutoCloseable { + private static final Logger logger = LoggerFactory.getLogger(DatabaseConnectXSTORE.class); + + private Connection connection; + + public DatabaseConnectXSTORE(String dbHost, String username) throws SQLException { + try { + Properties dbProperties = loadDatabaseProperties(); + + String url = dbProperties.getProperty("xstore.db.url").replace("HOST", dbHost); + String userpassword = dbProperties.getProperty("xstore.db." + username + ".password"); + + connection = DriverManager.getConnection(url, username, userpassword); + + logger.info("XSTORE Connection OK for user " + username + " on host " + dbHost); + } catch (SQLException e) { + logger.error("Failed to connect to XSTORE database for user " + username + " on host " + dbHost, e); + throw e; // re-throw the exception + } + } + + public Connection getConnection() { + return connection; + } + + @Override + public void close() throws SQLException { + if (connection != null && !connection.isClosed()) { + connection.close(); + logger.info("XSTORE Connection closed"); + } + } + + private Properties loadDatabaseProperties() { + Properties dbProperties = loadProperties("db.properties"); + return dbProperties; + } + + private Properties loadProperties(String fileName) { + Properties properties = new Properties(); + try (InputStream input = getClass().getClassLoader().getResourceAsStream(fileName)) { + properties.load(input); + } catch (IOException e) { + e.printStackTrace(); + // Handle the exception correctly for your application + } + return properties; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/services/DatabaseConnection.java b/src/main/java/com/example/services/DatabaseConnection.java deleted file mode 100644 index 39fc7c2..0000000 --- a/src/main/java/com/example/services/DatabaseConnection.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.example.services; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; - -public class DatabaseConnection implements AutoCloseable { - - private Connection connection; - - public DatabaseConnection(String dbHost, String username, String password) throws SQLException { - // Initialiser votre connexion à la base de données ici - connection = DriverManager.getConnection("jdbc:oracle:thin:@" + dbHost + ":1521/XSTORE", username, password); - } - - public Connection getConnection() { - return connection; - } - - @Override - public void close() throws SQLException { - if (connection != null && !connection.isClosed()) { - connection.close(); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/example/services/DatabaseConnectionDS.java b/src/main/java/com/example/services/DatabaseConnectionDS.java deleted file mode 100644 index 6148942..0000000 --- a/src/main/java/com/example/services/DatabaseConnectionDS.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.example.services; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; - -public class DatabaseConnectionDS implements AutoCloseable { - - private Connection connection; - - public DatabaseConnectionDS(String username, String password) throws SQLException { - // Initialiser votre connexion à la base de données ici - // jdbc:oracle:thin:@v-aspd-b01-ii-d.adic.lan:1521/IASPDI - // jdbc:oracle:thin:@v-aspd-b01-irdc.adic.lan:1521/MASPDI - connection = DriverManager.getConnection("jdbc:oracle:thin:@v-aspd-b01-irdc.adic.lan:1521/MASPDI", username, password); - } - - public Connection getConnection() { - return connection; - } - - @Override - public void close() throws SQLException { - if (connection != null && !connection.isClosed()) { - connection.close(); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/example/services/DatabaseService.java b/src/main/java/com/example/services/DatabaseService.java deleted file mode 100644 index 34803cc..0000000 --- a/src/main/java/com/example/services/DatabaseService.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.example.services; - -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - -@Path("/database") -public class DatabaseService { - - @GET - @Path("/replication") - @Produces(MediaType.APPLICATION_JSON) - public Response getCount(@QueryParam("dbHost") String dbHost) { - - if (dbHost == null) { - return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"dbHost parameter is required\"}").build(); - } - - DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes - - try (DatabaseConnection databaseConnection = new DatabaseConnection(dbHost, "repqueue", "repqueue")) { - String query = "SELECT COUNT(*) FROM CTL_REPLICATION_QUEUE"; - - try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query); - ResultSet resultSet = statement.executeQuery()) { - - if (resultSet.next()) { - long count = resultSet.getLong(1); - // Construction manuelle de la réponse JSON - String jsonResponse = "{\"count\":" + count + "}"; - return Response.ok(jsonResponse).build(); - } - } - } catch (SQLException e) { - e.printStackTrace(); // Gérer les exceptions correctement dans un environnement de production - - // Construction de la réponse JSON en cas d'erreur - String errorResponse = "{\"error\":\"" + e.getMessage() + "\"}"; - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorResponse).build(); - } - - return null; - } -} \ No newline at end of file diff --git a/src/main/java/com/example/services/FluxService.java b/src/main/java/com/example/services/FluxService.java new file mode 100644 index 0000000..5671ce8 --- /dev/null +++ b/src/main/java/com/example/services/FluxService.java @@ -0,0 +1,114 @@ +package com.example.services; + +import com.example.services.flux.bl.*; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Path("/flux") +public class FluxService { + private static final Logger logger = LoggerFactory.getLogger(DatabaseConnectDOTSOFT.class); + + /** + * Retrieves the FluxBlNotSent object from the server. + * + * @return the FluxBlNotSent object obtained from the server + */ + @GET + @Path("/bl/notsent") + @Produces(MediaType.APPLICATION_JSON) + public Response getFluxBlNotSent() { + + DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes + + try (DatabaseConnectDOTSOFT databaseConnection = new DatabaseConnectDOTSOFT("com02")) { + String query = "WITH err_bl AS (" + + "SELECT id_bon_livraison FROM omni.aspd_xsto_adrr_bl WHERE job_id = (" + + "SELECT MAX(job_id) FROM omni.aspd_xsto_adrr_bl))" + + "SELECT DISTINCT s.id_distrib, dis.libelle AS libelle_dis, s.id_structure, TRIM(s.nom) AS nom, s.enseigne, mq.code AS marque, m.code_saison, p.code_reference AS ref_r," + + "p.code_reference || '-' || pavc.code_externe AS ref_rc, p.code_reference || '-' || pavc.code_externe || '-' || TRIM(p.troc_axe2) AS ref_rct, p.nom AS nom_produit," + + "p.id_produit, bl.code_externe, bl.id_bon_livraison, bl.fdate AS date_bl, bl.id_structure AS id_expediteur, TRIM(st2.nom) AS expediteur, bl.remarques " + + "FROM COM02.bon_livraison bl " + + "JOIN err_bl ON err_bl.id_bon_livraison = bl.id_bon_livraison " + + "JOIN COM02.structure s ON s.id_structure = bl.id_destinataire " + + "LEFT OUTER JOIN COM02.STRUCTURE st2 ON st2.id_structure = bl.id_structure " + + "JOIN COM02.distributeur dis ON dis.id_distrib = s.id_distrib " + + "JOIN COM02.bon_livraison_colis blc ON blc.id_bordereau = bl.id_bon_livraison " + + "JOIN COM02.bon_livraison_colis_ligne blcl ON blcl.id_colis = blc.id_colis " + + "JOIN COM02.produit p ON p.id_produit = blcl.id_produit " + + "JOIN COM02.param_axe_valeur pavc ON pavc.id = p.id_type_axe_valeur1 " + + "JOIN COM02.modele m ON m.id_modele = p.code_modele " + + "JOIN COM02.marque mq ON mq.id_marque = m.id_marque " + + "LEFT OUTER JOIN OMNI.xst_produit xp ON (xp.id_distrib = s.id_distrib AND xp.id_produit = blcl.id_produit) " + + "WHERE bl.date_envoi_bl_numerique IS NULL AND blc.id_etat = 4 AND blcl.quantite != 0 AND xp.id_produit IS NULL " + + "ORDER BY s.id_distrib, dis.libelle, s.id_structure, TRIM(s.nom), m.code_saison"; + + logger.info(query); + + try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query)) { + ResultSet resultSet = statement.executeQuery(); + + List blNotSentList = new ArrayList<>(); + + while (resultSet.next()) { + FluxBlNotSent blnotsent = mapResultSetToBlNotSent(resultSet); + blNotSentList.add(blnotsent); + } + + ObjectMapper objectMapper = new ObjectMapper(); + String jsonResponse; + try { + jsonResponse = objectMapper.writeValueAsString(blNotSentList); + return Response.ok(jsonResponse).build(); + } catch (JsonProcessingException e) { + e.printStackTrace(); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("{\"error\":\"Error processing JSON\"}").build(); + } + } + } catch (SQLException e) { + e.printStackTrace(); + String errorResponse = "{\"error\":\"" + e.getMessage() + "\"}"; + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorResponse).build(); + } + } + + private FluxBlNotSent mapResultSetToBlNotSent(ResultSet resultSet) throws SQLException { + FluxBlNotSent blNotSent = new FluxBlNotSent(); + + blNotSent.setIdDistrib(resultSet.getInt("id_distrib")); + blNotSent.setLibelleDis(resultSet.getString("libelle_dis")); + blNotSent.setIdStructure(resultSet.getInt("id_structure")); + blNotSent.setNomStructure(resultSet.getString("nom")); + blNotSent.setEnseigne(resultSet.getString("enseigne")); + blNotSent.setMarque(resultSet.getString("marque")); + blNotSent.setCodeSaison(resultSet.getString("code_saison")); + blNotSent.setRefR(resultSet.getString("ref_r")); + blNotSent.setRefRc(resultSet.getString("ref_rc")); + blNotSent.setRefRct(resultSet.getString("ref_rct")); + blNotSent.setNomProduit(resultSet.getString("nom_produit")); + blNotSent.setIdProduit(resultSet.getInt("id_produit")); + blNotSent.setCodeExterne(resultSet.getString("code_externe")); + blNotSent.setIdBonLivraison(resultSet.getInt("id_bon_livraison")); + blNotSent.setDateBl(resultSet.getDate("date_bl")); + blNotSent.setIdExpediteur(resultSet.getInt("id_expediteur")); + blNotSent.setExpediteur(resultSet.getString("expediteur")); + blNotSent.setRemarques(resultSet.getString("remarques")); + + return blNotSent; + } +} diff --git a/src/main/java/com/example/services/HelloWebService.java b/src/main/java/com/example/services/HelloWebService.java index 4426f82..9875d04 100644 --- a/src/main/java/com/example/services/HelloWebService.java +++ b/src/main/java/com/example/services/HelloWebService.java @@ -8,6 +8,6 @@ public class HelloWebService { @GET public String sayHello() { - return "Hello, world!"; + return "Hello, I'm here to serve you!"; } } diff --git a/src/main/java/com/example/services/ItemService.java b/src/main/java/com/example/services/ItemService.java index 7146348..958184d 100644 --- a/src/main/java/com/example/services/ItemService.java +++ b/src/main/java/com/example/services/ItemService.java @@ -1,7 +1,13 @@ package com.example.services; +import com.example.services.item.Item; +import com.example.services.item.ItemOption; +import com.example.services.item.ItemPrice; +import com.example.services.item.ItemStock; + import javax.ws.rs.GET; import javax.ws.rs.Path; +import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; @@ -14,35 +20,41 @@ import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + @Path("/items") public class ItemService { + private static final Logger logger = LoggerFactory.getLogger(DatabaseConnectDOTSOFT.class); @GET - @Path("/get") + @Path("/{itemId}") @Produces(MediaType.APPLICATION_JSON) public Response getItemById( - @QueryParam("dbHost") String dbHost, - @QueryParam("itemId") String itemId) { + @PathParam("itemId") String itemId, + @QueryParam("dbHost") String dbHost) { + + if (itemId == null) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"itemId parameter is required\"}").build(); + } else if (itemId.length() < 6) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"Length of itemId must be greater than or equal to 6\"}").build(); + } if (dbHost == null) { return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"dbHost parameter is required\"}").build(); } - if (itemId == null) { - return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"itemId parameter is required\"}").build(); - } - DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes - try (DatabaseConnection databaseConnection = new DatabaseConnection(dbHost, "dtv", "dtv")) { - String query = "SELECT * FROM ITM_ITEM WHERE ITEM_ID LIKE ?" ; + try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost, "dtv")) { + String query = "SELECT * FROM dtv.ITM_ITEM WHERE ORGANIZATION_ID = 1 AND ITEM_ID LIKE ?"; try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query)) { - // Concaténer % au paramètre itemId + // Concatenate % to parameter itemId statement.setString(1, itemId + "%"); try (ResultSet resultSet = statement.executeQuery()) { @@ -53,13 +65,166 @@ public class ItemService { itemList.add(item); } - if (!itemList.isEmpty()) { - ObjectMapper objectMapper = new ObjectMapper(); - String jsonResponse = objectMapper.writeValueAsString(itemList); - return Response.ok(jsonResponse).build(); - } else { - return Response.status(Response.Status.NOT_FOUND).entity("{\"error\":\"No items found\"}").build(); + ObjectMapper objectMapper = new ObjectMapper(); + String jsonResponse = objectMapper.writeValueAsString(itemList); + + return Response.ok(jsonResponse).build(); + } + } + } catch (SQLException e) { + e.printStackTrace(); + String errorResponse = "{\"error\":\"" + e.getMessage() + "\"}"; + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorResponse).build(); + } catch (JsonProcessingException e) { + e.printStackTrace(); // Gérer les exceptions correctement dans un environnement de production + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("{\"error\":\"Error processing JSON\"}").build(); + } + } + + @GET + @Path("/{itemId}/options") + @Produces(MediaType.APPLICATION_JSON) + public Response getItemOptionsById( + @PathParam("itemId") String itemId, + @QueryParam("dbHost") String dbHost) { + + if (itemId == null) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"itemId parameter is required\"}").build(); + } else if (itemId.length() < 6) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"Length of itemId must be greater than or equal to 6\"}").build(); + } + + if (dbHost == null) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"dbHost parameter is required\"}").build(); + } + + DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes + + try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost, "dtv")) { + String query = "SELECT item_id,level_code,level_value,item_availability_code,tax_group_id,Vendor,season_code,create_date,create_user_id,update_date,update_user_id " + + "FROM dtv.ITM_ITEM_OPTIONS " + + "WHERE ORGANIZATION_ID = 1 AND ITEM_ID LIKE ?"; + + try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query)) { + // Concatenate % to parameter itemId + statement.setString(1, itemId + "%"); + + try (ResultSet resultSet = statement.executeQuery()) { + List itemOptionList = new ArrayList<>(); + + while (resultSet.next()) { + ItemOption itemOption = mapResultSetToItemOptionDetails(resultSet); + itemOptionList.add(itemOption); } + + ObjectMapper objectMapper = new ObjectMapper(); + String jsonResponse = objectMapper.writeValueAsString(itemOptionList); + + return Response.ok(jsonResponse).build(); + } + } + } catch (SQLException e) { + e.printStackTrace(); + String errorResponse = "{\"error\":\"" + e.getMessage() + "\"}"; + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorResponse).build(); + } catch (JsonProcessingException e) { + e.printStackTrace(); // Gérer les exceptions correctement dans un environnement de production + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("{\"error\":\"Error processing JSON\"}").build(); + } + } + + @GET + @Path("/{itemId}/price") + @Produces(MediaType.APPLICATION_JSON) + public Response getItemPricesById( + @PathParam("itemId") String itemId, + @QueryParam("dbHost") String dbHost) { + + if (itemId == null) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"itemId parameter is required\"}").build(); + } else if (itemId.length() < 6) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"Length of itemId must be greater than or equal to 6\"}").build(); + } + + if (dbHost == null) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"dbHost parameter is required\"}").build(); + } + + DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes + + try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost, "dtv")) { + String query = "SELECT item_id, level_code, level_value, itm_price_property_code, effective_date, expiration_date, price, price_qty, external_id, external_system, create_date, create_user_id, update_date, update_user_id " + + "FROM dtv.itm_item_prices " + + "WHERE organization_id = 1 AND item_id LIKE ?"; + + try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query)) { + // Concatenate % to parameter itemId + statement.setString(1, itemId + "%"); + + try (ResultSet resultSet = statement.executeQuery()) { + List itemPriceList = new ArrayList<>(); + + while (resultSet.next()) { + ItemPrice itemPrice = mapResultSetToItemPriceDetails(resultSet); + itemPriceList.add(itemPrice); + } + + ObjectMapper objectMapper = new ObjectMapper(); + String jsonResponse = objectMapper.writeValueAsString(itemPriceList); + + return Response.ok(jsonResponse).build(); + } + } + } catch (SQLException e) { + e.printStackTrace(); + String errorResponse = "{\"error\":\"" + e.getMessage() + "\"}"; + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorResponse).build(); + } catch (JsonProcessingException e) { + e.printStackTrace(); // Gérer les exceptions correctement dans un environnement de production + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("{\"error\":\"Error processing JSON\"}").build(); + } + } + + @GET + @Path("/{itemId}/stock") + @Produces(MediaType.APPLICATION_JSON) + public Response getItemStocksById( + @PathParam("itemId") String itemId, + @QueryParam("dbHost") String dbHost) { + + if (itemId == null) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"itemId parameter is required\"}").build(); + } else if (itemId.length() < 6) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"Length of itemId must be greater than or equal to 6\"}").build(); + } + + if (dbHost == null) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"dbHost parameter is required\"}").build(); + } + + DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes + + try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost, "dtv")) { + String query = "SELECT organization_id,rtl_loc_id,inv_location_id,bucket_id,item_id, unitcount,inventory_value,create_date, create_user_id,update_date , update_user_id " + + "FROM dtv.inv_stock_ledger_acct " + + "WHERE organization_id = 1 AND item_id LIKE ?"; + + try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query)) { + // Concatenate % to parameter itemId + statement.setString(1, itemId + "%"); + + try (ResultSet resultSet = statement.executeQuery()) { + List itemStockList = new ArrayList<>(); + + while (resultSet.next()) { + ItemStock itemStock = mapResultSetToItemStockDetails(resultSet); + itemStockList.add(itemStock); + } + + ObjectMapper objectMapper = new ObjectMapper(); + String jsonResponse = objectMapper.writeValueAsString(itemStockList); + + return Response.ok(jsonResponse).build(); } } } catch (SQLException e) { @@ -99,287 +264,68 @@ public class ItemService { item.setDimension2(resultSet.getString("DIMENSION2")); item.setDimension3(resultSet.getString("DIMENSION3")); item.setExternalSystem(resultSet.getString("EXTERNAL_SYSTEM")); - item.setCreateDate(resultSet.getTimestamp("CREATE_DATE")); + item.setCreateDate(resultSet.getDate("CREATE_DATE")); item.setCreateUserId(resultSet.getString("CREATE_USER_ID")); - item.setUpdateDate(resultSet.getTimestamp("UPDATE_DATE")); + item.setUpdateDate(resultSet.getDate("UPDATE_DATE")); item.setUpdateUserId(resultSet.getString("UPDATE_USER_ID")); - item.setRecordState(resultSet.getString("RECORD_STATE")); return item; } - public class Item { - private Long organizationId; - private String itemId; - private String orgCode; - private String orgValue; - private String name; - private String description; - private String merchLevel1; - private String merchLevel2; - private String merchLevel3; - private String merchLevel4; - private Integer listPrice; - private Integer measureReqFlag; - private String itemLevelCode; - private String parentItemId; - private Integer notInventoriedFlag; - private Integer serializedItemFlag; - private String itemTypeCode; - private String dtvClassName; - private String dimensionSystem; - private Integer disallowMatrixDisplayFlag; - private String itemMatrixColor; - private String dimension1; - private String dimension2; - private String dimension3; - private String externalSystem; - private Timestamp createDate; - private String createUserId; - private Timestamp updateDate; - private String updateUserId; - private String recordState; + private ItemOption mapResultSetToItemOptionDetails(ResultSet resultSet) throws SQLException { + ItemOption itemOption = new ItemOption(); - // Getters and Setters for all fields + itemOption.setItemId(resultSet.getString("ITEM_ID")); + itemOption.setLevelCode(resultSet.getString("LEVEL_CODE")); + itemOption.setLevelValue(resultSet.getString("LEVEL_VALUE")); + itemOption.setItemAvailabilityCode(resultSet.getString("ITEM_AVAILABILITY_CODE")); + itemOption.setTaxGroupId(resultSet.getString("TAX_GROUP_ID")); + itemOption.setVendor(resultSet.getString("VENDOR")); + itemOption.setSeasonCode(resultSet.getString("SEASON_CODE")); + itemOption.setCreateDate(resultSet.getDate("CREATE_DATE")); + itemOption.setCreateUserId(resultSet.getString("CREATE_USER_ID")); + itemOption.setUpdateDate(resultSet.getDate("UPDATE_DATE")); + itemOption.setUpdateUserId(resultSet.getString("UPDATE_USER_ID")); - public Long getOrganizationId() { - return organizationId; - } - - public void setOrganizationId(Long organizationId) { - this.organizationId = organizationId; - } - - public String getItemId() { - return itemId; - } - - public void setItemId(String itemId) { - this.itemId = itemId; - } - - public String getOrgCode() { - return orgCode; - } - - public void setOrgCode(String orgCode) { - this.orgCode = orgCode; - } - - public String getOrgValue() { - return orgValue; - } - - public void setOrgValue(String orgValue) { - this.orgValue = orgValue; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public String getMerchLevel1() { - return merchLevel1; - } - - public void setMerchLevel1(String merchLevel1) { - this.merchLevel1 = merchLevel1; - } - - public String getMerchLevel2() { - return merchLevel2; - } - - public void setMerchLevel2(String merchLevel2) { - this.merchLevel2 = merchLevel2; - } - - public String getMerchLevel3() { - return merchLevel3; - } - - public void setMerchLevel3(String merchLevel3) { - this.merchLevel3 = merchLevel3; - } - - public String getMerchLevel4() { - return merchLevel4; - } - - public void setMerchLevel4(String merchLevel4) { - this.merchLevel4 = merchLevel4; - } - - public Integer getListPrice() { - return listPrice; - } - - public void setListPrice(Integer listPrice) { - this.listPrice = listPrice; - } - - public Integer getMeasureReqFlag() { - return measureReqFlag; - } - - public void setMeasureReqFlag(Integer measureReqFlag) { - this.measureReqFlag = measureReqFlag; - } - - public String getItemLevelCode() { - return itemLevelCode; - } - - public void setItemLevelCode(String itemLevelCode) { - this.itemLevelCode = itemLevelCode; - } - - public String getParentItemId() { - return parentItemId; - } - - public void setParentItemId(String parentItemId) { - this.parentItemId = parentItemId; - } - - public Integer getNotInventoriedFlag() { - return notInventoriedFlag; - } - - public void setNotInventoriedFlag(Integer notInventoriedFlag) { - this.notInventoriedFlag = notInventoriedFlag; - } - - public Integer getSerializedItemFlag() { - return serializedItemFlag; - } - - public void setSerializedItemFlag(Integer serializedItemFlag) { - this.serializedItemFlag = serializedItemFlag; - } - - public String getItemTypeCode() { - return itemTypeCode; - } - - public void setItemTypeCode(String itemTypeCode) { - this.itemTypeCode = itemTypeCode; - } - - public String getDtvClassName() { - return dtvClassName; - } - - public void setDtvClassName(String dtvClassName) { - this.dtvClassName = dtvClassName; - } - - public String getDimensionSystem() { - return dimensionSystem; - } - - public void setDimensionSystem(String dimensionSystem) { - this.dimensionSystem = dimensionSystem; - } - - public Integer getDisallowMatrixDisplayFlag() { - return disallowMatrixDisplayFlag; - } - - public void setDisallowMatrixDisplayFlag(Integer disallowMatrixDisplayFlag) { - this.disallowMatrixDisplayFlag = disallowMatrixDisplayFlag; - } - - public String getItemMatrixColor() { - return itemMatrixColor; - } - - public void setItemMatrixColor(String itemMatrixColor) { - this.itemMatrixColor = itemMatrixColor; - } - - public String getDimension1() { - return dimension1; - } - - public void setDimension1(String dimension1) { - this.dimension1 = dimension1; - } - - public String getDimension2() { - return dimension2; - } - - public void setDimension2(String dimension2) { - this.dimension2 = dimension2; - } - - public String getDimension3() { - return dimension3; - } - - public void setDimension3(String dimension3) { - this.dimension3 = dimension3; - } - - public String getExternalSystem() { - return externalSystem; - } - - public void setExternalSystem(String externalSystem) { - this.externalSystem = externalSystem; - } - - public Timestamp getCreateDate() { - return createDate; - } - - public void setCreateDate(Timestamp createDate) { - this.createDate = createDate; - } - - public String getCreateUserId() { - return createUserId; - } - - public void setCreateUserId(String createUserId) { - this.createUserId = createUserId; - } - - public Timestamp getUpdateDate() { - return updateDate; - } - - public void setUpdateDate(Timestamp updateDate) { - this.updateDate = updateDate; - } - - public String getUpdateUserId() { - return updateUserId; - } - - public void setUpdateUserId(String updateUserId) { - this.updateUserId = updateUserId; - } - - public String getRecordState() { - return recordState; - } - - public void setRecordState(String recordState) { - this.recordState = recordState; - } + return itemOption; } -} + + private ItemPrice mapResultSetToItemPriceDetails(ResultSet resultSet) throws SQLException { + ItemPrice itemPrices = new ItemPrice(); + + itemPrices.setItemId(resultSet.getString("ITEM_ID")); + itemPrices.setLevelCode(resultSet.getString("LEVEL_CODE")); + itemPrices.setLevelValue(resultSet.getString("LEVEL_VALUE")); + itemPrices.setItmPricePropertyCode(resultSet.getString("ITM_PRICE_PROPERTY_CODE")); + itemPrices.setEffectiveDate(resultSet.getDate("EFFECTIVE_DATE")); + itemPrices.setExpirationDate(resultSet.getDate("EXPIRATION_DATE")); + itemPrices.setPrice(resultSet.getDouble("PRICE")); + itemPrices.setPriceQty(resultSet.getDouble("PRICE_QTY")); + itemPrices.setExternalId(resultSet.getString("EXTERNAL_ID")); + itemPrices.setExternalSystem(resultSet.getString("EXTERNAL_SYSTEM")); + itemPrices.setCreateDate(resultSet.getDate("CREATE_DATE")); + itemPrices.setCreateUserId(resultSet.getString("CREATE_USER_ID")); + itemPrices.setUpdateDate(resultSet.getDate("UPDATE_DATE")); + itemPrices.setUpdateUserId(resultSet.getString("UPDATE_USER_ID")); + + return itemPrices; + } + + private ItemStock mapResultSetToItemStockDetails(ResultSet resultSet) throws SQLException { + ItemStock itemStock = new ItemStock(); + + itemStock.setOrganizationId(resultSet.getString("ORGANIZATION_ID")); + itemStock.setRtlLocId(resultSet.getString("RTL_LOC_ID")); + itemStock.setInvLocationId(resultSet.getString("INV_LOCATION_ID")); + itemStock.setBucketId(resultSet.getString("BUCKET_ID")); + itemStock.setItemId(resultSet.getString("ITEM_ID")); + itemStock.setUnitCount(resultSet.getInt("UNITCOUNT")); + itemStock.setInventoryValue(resultSet.getDouble("INVENTORY_VALUE")); + itemStock.setCreateDate(resultSet.getDate("CREATE_DATE")); + itemStock.setCreateUserId(resultSet.getString("CREATE_USER_ID")); + itemStock.setUpdateDate(resultSet.getDate("UPDATE_DATE")); + itemStock.setUpdateUserId(resultSet.getString("UPDATE_USER_ID")); + + return itemStock; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/services/StoreService.java b/src/main/java/com/example/services/StoreService.java index 555e9d5..26c888a 100644 --- a/src/main/java/com/example/services/StoreService.java +++ b/src/main/java/com/example/services/StoreService.java @@ -1,7 +1,11 @@ package com.example.services; +import com.example.services.store.*; +import com.example.services.xadmin.log.XadminLog; + import javax.ws.rs.GET; import javax.ws.rs.Path; +import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; @@ -10,6 +14,7 @@ import javax.ws.rs.core.Response; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import java.sql.Date; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -20,35 +25,67 @@ import java.util.List; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + @Path("/stores") public class StoreService { - private static List cachedStoreList; + private static final Logger logger = LoggerFactory.getLogger(StoreService.class); + + private static List cachedStoreList; private static final Lock cacheLock = new ReentrantLock(); + /** + * Retrieves a store by its ID. + * + * @param storeId the ID of the store to retrieve + * @return a response containing the store information in JSON format + */ @GET - @Path("/get") + @Path("/{storeId}") @Produces(MediaType.APPLICATION_JSON) - public Response getStoreById(@QueryParam("storeId") String storeId) { + public Response getStoreById(@PathParam("storeId") String storeId) { if (storeId == null) { return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"storeId parameter is required\"}").build(); } - DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes + DriverManager.setLoginTimeout(5); // Set timeout to 5 seconds - // IASPDI com02 / B1Xto9pAbtBCOxuecG7W - // MASPDI com02 / - try (DatabaseConnectionDS databaseConnection = new DatabaseConnectionDS("com02", "B1Xto9pAbtBCOxuecG7W")) { - String query = "SELECT id_structure,nom,'10.100.0.18' AS ip, tel1 AS telephone FROM structure WHERE id_structure = ?" ; + try (DatabaseConnectDOTSOFT databaseConnection = new DatabaseConnectDOTSOFT("com02")) { + String query = "SELECT st.id_structure," + + " TRIM(st.nom) as nom," + + " st.tel1 as telephone," + + " st.enseigne," + + " 'https://mp4.ikksgroup.com/photos/' || CASE WHEN metabp.id_photo_principale IS NOT NULL THEN mpprinc.url || TO_CHAR (metabp.id_photo_principale) " + "ELSE '0/0' END || '-small.JPG' as photoLink," + + " TRIM(pp.nom) AS pays, " + + " (" + + " SELECT" + + " NVL(STRAGG(hsc2.id_caisse || '|' || hsc2.ip),'0|0.0.0.0')" + + " FROM" + + " com02.HOTLINE_STRUCTURE_CAISSE hsc2" + + " WHERE" + + " hsc2.id_structure = st.id_structure" + + " AND hsc2.id_caisse BETWEEN 20 AND 39) AS caisses," + + " REPLACE(REPLACE(TRIM(st.adresse1), chr(10), ''), chr(13), '') AS adresse," + + " axs.date_stock as date_migration" + + " FROM COM02.structure st" + + " JOIN com02.PARAM_PAYS pp ON pp.id_pays = st.id_pays" + + " LEFT OUTER JOIN mobretail.mp_etab_param metabp ON metabp.id_etab = st.id_structure" + + " LEFT OUTER JOIN mobretail.mr_photo mpprinc ON mpprinc.id_photo = metabp.id_photo_principale" + + " LEFT OUTER JOIN omni.ASPD_XSTO_STRUCTURE axs ON st.ID_STRUCTURE = axs.ID_STRUCTURE " + + " WHERE st.id_structure = ?"; + logger.info(query); try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query)) { statement.setString(1, storeId); try (ResultSet resultSet = statement.executeQuery()) { if (resultSet.next()) { - store store = mapResultSetTostore(resultSet); - + Store store = mapResultSetTostore(resultSet); + ObjectMapper objectMapper = new ObjectMapper(); String jsonResponse = objectMapper.writeValueAsString(store); + return Response.ok(jsonResponse).build(); } else { return Response.status(Response.Status.NOT_FOUND).entity("{\"error\":\"No store found\"}").build(); @@ -60,22 +97,44 @@ public class StoreService { String errorResponse = "{\"error\":\"" + e.getMessage() + "\"}"; return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorResponse).build(); } catch (JsonProcessingException e) { - e.printStackTrace(); // Gérer les exceptions correctement dans un environnement de production + e.printStackTrace(); // Handle exceptions correctly in a production environment return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("{\"error\":\"Error processing JSON\"}").build(); } } + /** + * Sets cachedStoreList to null, forcing a reload of stores from the database on the next call to /stores. + * + * @return A response indicating success + */ + @GET + @Path("/reload") + public Response reloadStores() { + cacheLock.lock(); + try { + cachedStoreList = null; + } finally { + cacheLock.unlock(); + } + + return Response.ok("{\"status\":\"Cache cleared\"}").build(); + } + + /** + * Retrieves all stores from the database and returns them as a JSON response. + * + * @return A JSON response containing the list of stores + */ @GET - @Path("/getAll") @Produces(MediaType.APPLICATION_JSON) public Response getAllStores() { if (cachedStoreList == null) { - // Utilisation d'un verrou pour éviter que plusieurs requêtes déclenchent la récupération simultanée + // Use of a lock to prevent multiple requests from triggering simultaneous retrieval cacheLock.lock(); try { - // Vérification à nouveau après avoir acquis le verrou + // Check again after acquiring the lock if (cachedStoreList == null) { - // Récupérer depuis la base de données seulement si la liste n'est pas en cache + // Retrieve from database only if list is not cached cachedStoreList = retrieveStoresFromDatabase(); } } finally { @@ -83,38 +142,58 @@ public class StoreService { } } - if (!cachedStoreList.isEmpty()) { - ObjectMapper objectMapper = new ObjectMapper(); - String jsonResponse; - try { - jsonResponse = objectMapper.writeValueAsString(cachedStoreList); - return Response.ok(jsonResponse).build(); - } catch (JsonProcessingException e) { - e.printStackTrace(); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("{\"error\":\"Error processing JSON\"}").build(); - } - } else { - return Response.status(Response.Status.NOT_FOUND).entity("{\"error\":\"No stores found\"}").build(); + ObjectMapper objectMapper = new ObjectMapper(); + String jsonResponse; + try { + jsonResponse = objectMapper.writeValueAsString(cachedStoreList); + return Response.ok(jsonResponse).build(); + } catch (JsonProcessingException e) { + e.printStackTrace(); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("{\"error\":\"Error processing JSON\"}").build(); } } - private List retrieveStoresFromDatabase() { - DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes + /** + * Retrieves stores from the database. + * + * @return a list of stores retrieved from the database + */ + private List retrieveStoresFromDatabase() { + DriverManager.setLoginTimeout(5); // Set timeout to 5 seconds - try (DatabaseConnectionDS databaseConnection = new DatabaseConnectionDS("com02", "B1Xto9pAbtBCOxuecG7W")) { - String query = "SELECT st.id_structure, TRIM(st.nom) as nom, '10.100.0.18' AS ip, " + - "st.tel1 AS telephone " + - "FROM COM02.STRUCTURE st " + - "LEFT OUTER JOIN omni.ASPD_XSTO_STRUCTURE axs ON st.ID_STRUCTURE = axs.ID_STRUCTURE " + - "WHERE st.id_structure < 50"; - + try (DatabaseConnectDOTSOFT databaseConnection = new DatabaseConnectDOTSOFT("com02")) { + String query = "SELECT st.id_structure," + + " TRIM(st.nom) as nom," + + " st.tel1 as telephone," + + " st.enseigne," + + " 'https://mp4.ikksgroup.com/photos/' || CASE WHEN metabp.id_photo_principale IS NOT NULL THEN mpprinc.url || TO_CHAR (metabp.id_photo_principale) " + "ELSE '0/0' END || '-small.JPG' as photoLink," + + " TRIM(pp.nom) AS pays, " + + " (" + + " SELECT" + + " NVL(STRAGG(hsc2.id_caisse || '|' || hsc2.ip),'0|0.0.0.0')" + + " FROM" + + " com02.HOTLINE_STRUCTURE_CAISSE hsc2" + + " WHERE" + + " hsc2.id_structure = st.id_structure" + + " AND hsc2.id_caisse BETWEEN 20 AND 39) AS caisses," + + " REPLACE(REPLACE(TRIM(st.adresse1), chr(10), ''), chr(13), '') AS adresse," + + " axs.date_stock as date_migration" + + " FROM COM02.structure st" + + " JOIN com02.PARAM_PAYS pp ON pp.id_pays = st.id_pays" + + " LEFT OUTER JOIN mobretail.mp_etab_param metabp ON metabp.id_etab = st.id_structure" + + " LEFT OUTER JOIN mobretail.mr_photo mpprinc ON mpprinc.id_photo = metabp.id_photo_principale" + + " LEFT OUTER JOIN omni.ASPD_XSTO_STRUCTURE axs ON st.ID_STRUCTURE = axs.ID_STRUCTURE" + + " WHERE axs.date_stock is not null AND st.ID_NIVEAU=4 AND st.STATUT=2 AND st.id_canal_distribution = 1 and st.magasin_demo = 0" + + " ORDER BY st.id_structure"; + + logger.info(query); try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query); ResultSet resultSet = statement.executeQuery()) { - List storeList = new ArrayList<>(); + List storeList = new ArrayList<>(); while (resultSet.next()) { - store store = mapResultSetTostore(resultSet); + Store store = mapResultSetTostore(resultSet); storeList.add(store); } @@ -126,54 +205,722 @@ public class StoreService { } } - private store mapResultSetTostore(ResultSet resultSet) throws SQLException { - store store = new store(); + @GET + @Path("/{storeId}/sequence") + @Produces(MediaType.APPLICATION_JSON) + public Response getSequence( + @PathParam("storeId") Integer storeId, + @QueryParam("dbHost") String dbHost) { + + if(storeId == null) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"storeId parameter is required\"}").build(); + } + + if (dbHost == null) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"dbHost parameter is required\"}").build(); + } + + DriverManager.setLoginTimeout(5); // Set timeout to 5 seconds + + try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost,"dtv")) { + + String query = "SELECT ORGANIZATION_ID, RTL_LOC_ID, WKSTN_ID, SEQUENCE_ID, SEQUENCE_MODE, SEQUENCE_NBR, CREATE_DATE, CREATE_USER_ID, UPDATE_DATE, UPDATE_USER_ID, RECORD_STATE "+ + "FROM DTV.COM_SEQUENCE " + + "WHERE organization_id = 1 " + + "ORDER BY WKSTN_ID, SEQUENCE_ID"; + + logger.info(query); + try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query)) { + ResultSet resultSet = statement.executeQuery(); + + List sequenceList = new ArrayList<>(); + + while (resultSet.next()) { + StoreSequence sequence = mapResultSetToStoreSequence(resultSet); + sequenceList.add(sequence); + } + + ObjectMapper objectMapper = new ObjectMapper(); + String jsonResponse; + + try { + jsonResponse = objectMapper.writeValueAsString(sequenceList); + return Response.ok(jsonResponse).build(); + } catch (JsonProcessingException e) { + e.printStackTrace(); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("{\"error\":\"Error processing JSON\"}").build(); + } + } + } catch (SQLException e) { + e.printStackTrace(); + String errorResponse = "{\"error\":\"" + e.getMessage() + "\"}"; + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorResponse).build(); + } + } + + @GET + @Path("/{storeId}/signature") + @Produces(MediaType.APPLICATION_JSON) + public Response getSignature( + @PathParam("storeId") Integer storeId, + @QueryParam("dbHost") String dbHost) { + + if(storeId == null) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"storeId parameter is required\"}").build(); + } + + if (dbHost == null) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"dbHost parameter is required\"}").build(); + } + + DriverManager.setLoginTimeout(5); // Set timeout to 5 seconds + + try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost,"dtv")) { + String query = "SELECT ORGANIZATION_ID, RTL_LOC_ID, WKSTN_ID, SIGNATURE_ID, SIGNATURE_MODE, SIGNATURE_STRING, SIGNATURE_SOURCE, CREATE_DATE, CREATE_USER_ID, UPDATE_DATE, UPDATE_USER_ID, RECORD_STATE " + + "FROM DTV.COM_SIGNATURE " + + "WHERE organization_id = 1 " + + "ORDER BY WKSTN_ID"; + + logger.info(query); + try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query)) { + ResultSet resultSet = statement.executeQuery(); + + List signatureList = new ArrayList<>(); + + while (resultSet.next()) { + StoreSignature signature = mapResultSetToStoreSignature(resultSet); + signatureList.add(signature); + } + + ObjectMapper objectMapper = new ObjectMapper(); + String jsonResponse; + + try { + jsonResponse = objectMapper.writeValueAsString(signatureList); + return Response.ok(jsonResponse).build(); + } catch (JsonProcessingException e) { + e.printStackTrace(); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("{\"error\":\"Error processing JSON\"}").build(); + } + } + } catch (SQLException e) { + e.printStackTrace(); + String errorResponse = "{\"error\":\"" + e.getMessage() + "\"}"; + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorResponse).build(); + } + } + + @GET + @Path("/{storeId}/version") + @Produces(MediaType.APPLICATION_JSON) + public Response getVersion( + @PathParam("storeId") Integer storeId, + @QueryParam("dbHost") String dbHost) { + + if(storeId == null) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"storeId parameter is required\"}").build(); + } + + if (dbHost == null) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"dbHost parameter is required\"}").build(); + } + + DriverManager.setLoginTimeout(5); // Set timeout to 5 seconds + + try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost,"dtv")) { + + String query = "SELECT ORGANIZATION_ID,SEQ,BASE_SCHEMA_VERSION,CUSTOMER_SCHEMA_VERSION,CUSTOMER,BASE_SCHEMA_DATE,CUSTOMER_SCHEMA_DATE, " + + "CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID " + + "FROM dtv.CTL_VERSION_HISTORY " + + "WHERE organization_id = 1 AND customer IS NOT NULL " + + "ORDER BY seq DESC"; + + logger.info(query); + try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query)) { + ResultSet resultSet = statement.executeQuery(); + + List versionList = new ArrayList<>(); + + while (resultSet.next()) { + StoreVersion version = mapResultSetToStoreVersion(resultSet); + versionList.add(version); + } + + ObjectMapper objectMapper = new ObjectMapper(); + String jsonResponse; + try { + jsonResponse = objectMapper.writeValueAsString(versionList); + return Response.ok(jsonResponse).build(); + } catch (JsonProcessingException e) { + e.printStackTrace(); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("{\"error\":\"Error processing JSON\"}").build(); + } + } + } catch (SQLException e) { + e.printStackTrace(); + String errorResponse = "{\"error\":\"" + e.getMessage() + "\"}"; + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorResponse).build(); + } + } + + @GET + @Path("/{storeId}/log") + @Produces(MediaType.APPLICATION_JSON) + public Response getLog( + @PathParam("storeId") Integer storeId, + @QueryParam("dbHost") String dbHost, + @QueryParam("logDate") String logDate) { + + if(storeId == null) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"storeId parameter is required\"}").build(); + } + + if (logDate == null) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"logDate parameter is required\"}").build(); + } + + if (dbHost == null) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"dbHost parameter is required\"}").build(); + } + + DriverManager.setLoginTimeout(5); // Set timeout to 5 seconds + + try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost,"dtv")) { + String query = "SELECT" + + " FROM_TZ(cel.CREATE_DATE, 'UTC') " + + " AT TIME ZONE " + + " CASE loc.COUNTRY " + + " WHEN 'CH' THEN 'Europe/Zurich' " + + " WHEN 'NL' THEN 'Europe/Amsterdam' " + + " WHEN 'MC' THEN 'Europe/Monaco' " + + " WHEN 'LU' THEN 'Europe/Luxembourg' " + + " WHEN 'ES' THEN 'Europe/Madrid' " + + " WHEN 'FR' THEN 'Europe/Paris' " + + " WHEN 'US' THEN 'America/New_York' " + + " WHEN 'GB' THEN 'Europe/London' " + + " WHEN 'BE' THEN 'Europe/Brussels' " + + " ELSE 'UTC' " + + " END " + + "AS CREATE_DATE, " + + "cel.CREATE_USER_ID, " + + "cel.BUSINESS_DATE, " + + "cel.RTL_LOC_ID, "+ + "cel.RTL_LOC_ID || ' - ' || loc.STORE_NAME AS STORE_NAME, " + + "cel.WKSTN_ID, " + + "cel.LOG_LEVEL, " + + "cel.THREAD_NAME, " + + "cel.LOG_MESSAGE, " + + "CASE WHEN cel.LOGGER_CATEGORY = 'dtv.xstore.app.preflight' THEN 'Pre-flight error' " + + " WHEN cel.LOGGER_CATEGORY LIKE 'dtv.xstore.dataloader%' THEN 'DataLoader' " + + " WHEN cel.LOGGER_CATEGORY = 'dtv.sysadmin.data.failover' THEN 'Data-failover' " + + " WHEN cel.LOGGER_CATEGORY = 'dtv.xstore.order.download.offline' THEN 'Order error' " + + " WHEN cel.LOGGER_CATEGORY = 'dtv.xstore.state.app.startup' THEN 'Xstore startup' " + + " WHEN cel.LOGGER_CATEGORY = 'dtv.xstore.state.app.shutdown' THEN 'Xstore shutdown' " + + " WHEN cel.LOGGER_CATEGORY = 'dtv.xstore.helpdesk.memory' THEN 'Application core' " + + " WHEN cel.LOGGER_CATEGORY = 'dtv.xstore.helpdesk' THEN 'Application core' " + + " WHEN cel.LOGGER_CATEGORY = 'dtv.sysadmin.data.repqueue.errors' THEN 'Replication errors' " + + " WHEN cel.LOGGER_CATEGORY = 'dtv.sysadmin.data.repqueue.nofails' THEN 'Replication errors' " + + " WHEN cel.LOGGER_CATEGORY = 'dtv.xstore.hardware.init' THEN 'Hardware init' " + + " WHEN cel.LOGGER_CATEGORY = 'dtv.xstore.sensitive-data.logging' THEN 'Sensitive data logging' " + + " WHEN cel.LOGGER_CATEGORY = 'dtv.xstore.uncaught' THEN 'Uncaught exception' " + + "ELSE cel.LOGGER_CATEGORY END as LOGGER_CATEGORY " + + "FROM dtv.CTL_EVENT_LOG cel " + + "JOIN dtv.LOC_RTL_LOC loc ON loc.RTL_LOC_ID = cel.RTL_LOC_ID " + + "WHERE cel.CREATE_DATE BETWEEN " + + "TO_TIMESTAMP(?, 'YYYYMMDD HH24:MI:SS') - INTERVAL '3' HOUR " + + "AND " + + "TO_TIMESTAMP(?, 'YYYYMMDD HH24:MI:SS') + INTERVAL '3' HOUR " + + "AND TO_CHAR(FROM_TZ(cel.CREATE_DATE, 'UTC') AT TIME ZONE " + + "CASE loc.COUNTRY " + + " WHEN 'CH' THEN 'Europe/Zurich' " + + " WHEN 'NL' THEN 'Europe/Amsterdam' " + + " WHEN 'MC' THEN 'Europe/Monaco' " + + " WHEN 'LU' THEN 'Europe/Luxembourg' " + + " WHEN 'ES' THEN 'Europe/Madrid' " + + " WHEN 'FR' THEN 'Europe/Paris' " + + " WHEN 'US' THEN 'America/New_York' " + + " WHEN 'GB' THEN 'Europe/London' " + + " WHEN 'BE' THEN 'Europe/Brussels' " + + " ELSE 'UTC' " + + "END, 'YYYYMMDD HH24:MI:SS') BETWEEN ? AND ? " + + "AND cel.ORGANIZATION_ID = 1 " + + "AND cel.RTL_LOC_ID = ? " + + "AND cel.THREAD_NAME IS NOT NULL " + + "ORDER BY cel.CREATE_DATE DESC"; + + logger.info(query); + try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query)) { + statement.setString(1, logDate + " 00:00:00"); + statement.setString(2, logDate + " 23:59:59"); + statement.setString(3, logDate + " 00:00:00"); + statement.setString(4, logDate + " 23:59:59"); + statement.setInt(5, storeId); + + ResultSet resultSet = statement.executeQuery(); + + List storeLogList = new ArrayList<>(); + + while (resultSet.next()) { + XadminLog storeLog = mapResultSetToStoreLog(resultSet); + storeLogList.add(storeLog); + } + + ObjectMapper objectMapper = new ObjectMapper(); + String jsonResponse; + try { + jsonResponse = objectMapper.writeValueAsString(storeLogList); + return Response.ok(jsonResponse).build(); + } catch (JsonProcessingException e) { + e.printStackTrace(); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("{\"error\":\"Error processing JSON\"}").build(); + } + } + } catch (SQLException e) { + e.printStackTrace(); + String errorResponse = "{\"error\":\"" + e.getMessage() + "\"}"; + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorResponse).build(); + } + } + + public XadminLog mapResultSetToStoreLog(ResultSet resultSet) throws SQLException { + XadminLog xadminlog = new XadminLog(); + + xadminlog.setCreateDate(resultSet.getDate("CREATE_DATE")); + xadminlog.setCreateUserId(resultSet.getString("CREATE_USER_ID")); + xadminlog.setBusinessDate(resultSet.getDate("BUSINESS_DATE")); + xadminlog.setRtlLocId(resultSet.getInt("RTL_LOC_ID")); + xadminlog.setStoreName(resultSet.getString("STORE_NAME")); + xadminlog.setWkstnId(resultSet.getInt("WKSTN_ID")); + xadminlog.setLogLevel(resultSet.getString("LOG_LEVEL")); + xadminlog.setThreadName(resultSet.getString("THREAD_NAME")); + xadminlog.setLogMessage(resultSet.getString("LOG_MESSAGE")); + xadminlog.setLoggerCategory(resultSet.getString("LOGGER_CATEGORY")); + + return xadminlog; + } + + /** + * Maps a ResultSet to a store object. + * + * @param resultSet the ResultSet containing the data to be mapped + * @return the store object with mapped data + * @throws SQLException if there is an error accessing the data from the ResultSet + */ + private Store mapResultSetTostore(ResultSet resultSet) throws SQLException { + Store store = new Store(); store.setId_structure(resultSet.getInt("ID_STRUCTURE")); store.setNom(resultSet.getString("NOM")); - store.setIp(resultSet.getString("IP")); store.setTelephone(resultSet.getString("TELEPHONE")); + store.setEnseigne(resultSet.getString("ENSEIGNE")); + store.setPhotoLink(resultSet.getString("PHOTOLINK")); + store.setPays(resultSet.getString("PAYS")); + store.setCaisses(resultSet.getString("CAISSES")); + store.setAdresse(resultSet.getString("ADRESSE")); + store.setDate_migration(resultSet.getDate("DATE_MIGRATION")); return store; } - public class store { - private Integer id_structure; - private String nom; - private String ip; - private String telephone; - - public Integer getId_structure() { - return id_structure; + @GET + @Path("/{storeId}/details") + @Produces(MediaType.APPLICATION_JSON) + public Response getStoreDetails( + @PathParam("storeId") Integer storeId, + @QueryParam("dbHost") String dbHost) { + + if (dbHost == null) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"dbHost parameter is required\"}").build(); + } + + if (storeId == null) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"storeId parameter is required\"}").build(); } - - public void setId_structure(Integer id_structure) { - this.id_structure = id_structure; - } - - public String getNom() { - return nom; - } - - public void setNom(String nom) { - this.nom = nom; - } - - public String getIp() { - return ip; - } - - public void setIp(String ip) { - this.ip = ip; - } - - public String getTelephone() { - return telephone; - } - - public void setTelephone(String telephone) { - this.telephone = telephone; + + try { + StoreDetails storeDetails = retrieveStoreDetails(dbHost,storeId); + + ObjectMapper objectMapper = new ObjectMapper(); + try { + String jsonResponse = objectMapper.writeValueAsString(storeDetails); + return Response.ok(jsonResponse).build(); + } catch (JsonProcessingException e) { + e.printStackTrace(); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity("{\"error\":\"Error converting StoreDetails to JSON\"}") + .build(); + } + } catch (RuntimeException e) { + // Capture the RuntimeException to manage SQL errors + e.printStackTrace(); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("{\"error\":\"" + e.getMessage() + "\"}").build(); } } + + /** + * Retrieves storeDetails from the database. + * + * @param dbHost the host of the database + * @param storeId the ID of the store + * @param workstationId the ID of the workstation + * @return storeDetails + */ + private StoreDetails retrieveStoreDetails(String dbHost, Integer storeId) { + DriverManager.setLoginTimeout(5); + StoreDetails storeDetails = new StoreDetails(); // Declare object outside try blocks + + try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost,"dtv")) { + // get Pos list + String PosQuery = "SELECT cdr.RTL_LOC_ID, " + + "cdr.WKSTN_ID, " + + "cdr.IP_ADDRESS, " + + "cdr.BUSINESS_DATE, " + + "cdr.XSTORE_VERSION, " + + "cdr.PRIMARY_REGISTER_FLAG " + + "FROM dtv.ctl_device_registration cdr " + + "WHERE cdr.ORGANIZATION_ID = 1 " + + "ORDER BY cdr.PRIMARY_REGISTER_FLAG desc, cdr.WKSTN_ID"; + + logger.info(PosQuery); + + try (PreparedStatement posStatement = databaseConnection.getConnection().prepareStatement(PosQuery)) { + try (ResultSet posResultSet = posStatement.executeQuery()) { + Integer posRtlLocId = 0; + Integer posWkstnId = 0; + String posIp = ""; + String posVersion = ""; + Date posBusinessDate = null; + Integer primaryRegisterFlag = 0; + + while (posResultSet.next()) { + posRtlLocId = posResultSet.getInt("RTL_LOC_ID"); + posWkstnId = posResultSet.getInt("WKSTN_ID"); + posIp = posResultSet.getString("IP_ADDRESS"); + posVersion = posResultSet.getString("XSTORE_VERSION"); + posBusinessDate = posResultSet.getDate("BUSINESS_DATE"); + primaryRegisterFlag = posResultSet.getInt("PRIMARY_REGISTER_FLAG"); + + StorePos pos = new StorePos(); + + // add new pos object + storeDetails.getPos().add(pos); + pos.setWorkstationId(posWkstnId); + pos.setIp(posIp); + pos.setVersion(posVersion); + pos.setBusinessDate(posBusinessDate); + pos.setPrimaryRegister(primaryRegisterFlag); + pos.setFatalError(1); + + // retrieve all pos details only on database of the master pos + retrieveStorePosDetails(databaseConnection, posRtlLocId, posWkstnId, posBusinessDate, pos); + + /* if (posResultSet.getString("IP_ADDRESS").equals(dbHost)) { + retrieveStorePosDetails(databaseConnection, posRtlLocId, posWkstnId, posBusinessDate, pos); + } else { + try (DatabaseConnectXSTORE newDatabaseConnection = new DatabaseConnectXSTORE(posIp,"dtv")) { + retrieveStorePosDetails(newDatabaseConnection, posRtlLocId, posWkstnId, posBusinessDate, pos); + } catch (SQLException e) { + e.printStackTrace(); + // Handle exceptions correctly in a production environment + } + } */ + } + } + } + } catch (SQLException e) { + e.printStackTrace(); + // Handle exceptions correctly in a production environment + } + + try (DatabaseConnectDOTSOFT databaseConnectionDS = new DatabaseConnectDOTSOFT("com02")) { + // Store section + String storeQuery = "SELECT st.id_structure," + + " TRIM(st.nom) as nom," + + " st.tel1 as telephone," + + " st.enseigne," + + " 'https://mp4.ikksgroup.com/photos/' || CASE WHEN metabp.id_photo_principale IS NOT NULL THEN mpprinc.url || TO_CHAR (metabp.id_photo_principale) " + "ELSE '0/0' END || '-small.JPG' as photoLink," + + " TRIM(pp.nom) AS pays, " + + " (" + + " SELECT" + + " NVL(STRAGG(hsc2.id_caisse || '|' || hsc2.ip),'0|0.0.0.0')" + + " FROM" + + " com02.HOTLINE_STRUCTURE_CAISSE hsc2" + + " WHERE" + + " hsc2.id_structure = st.id_structure" + + " AND hsc2.id_caisse BETWEEN 20 AND 39) AS caisses," + + " REPLACE(REPLACE(TRIM(st.adresse1), chr(10), ''), chr(13), '') AS adresse," + + " axs.date_stock as date_migration" + + " FROM COM02.structure st" + + " JOIN com02.PARAM_PAYS pp ON pp.id_pays = st.id_pays" + + " LEFT OUTER JOIN mobretail.mp_etab_param metabp ON metabp.id_etab = st.id_structure" + + " LEFT OUTER JOIN mobretail.mr_photo mpprinc ON mpprinc.id_photo = metabp.id_photo_principale" + + " LEFT OUTER JOIN omni.ASPD_XSTO_STRUCTURE axs ON st.ID_STRUCTURE = axs.ID_STRUCTURE " + + " WHERE st.id_structure = ?"; + + logger.info(storeQuery); + try (PreparedStatement storeStatement = databaseConnectionDS.getConnection().prepareStatement(storeQuery)) { + storeStatement.setInt(1, storeId); // Set the value of the parameter + + try (ResultSet storeResultSet = storeStatement.executeQuery()) { + if (storeResultSet.next()) { + Store store = mapResultSetToStore(storeResultSet); + storeDetails.setStore(store); + } else { + // Adjust to the desired behavior if no results are found + } + } + } + + // Transaction section + String boTransactionQuery = + "SELECT COUNT(*) AS backOfficeTransactions, " + + " MIN(cf.fdate_integration) AS minBackOfficeTransactionDate, " + + " MAX(cf.fdate_integration) AS maxBackOfficeTransactionDate " + + "FROM com02.client_facture cf " + + "WHERE cf.id_structure = ? " + + " AND cf.id_caisse = ? " + + " AND TRUNC(cf.fdate) = ? " + + " AND cf.version_info = 'XSTORE'"; + + for (StorePos pos : storeDetails.getPos()) { + logger.info(boTransactionQuery); + try (PreparedStatement boTransactionStatement = databaseConnectionDS.getConnection().prepareStatement(boTransactionQuery)) { + boTransactionStatement.setInt(1, storeId); + boTransactionStatement.setInt(2, pos.getWorkstationId()); + boTransactionStatement.setDate(3, pos.getBusinessDate()); + + try (ResultSet boTransactionResultSet = boTransactionStatement.executeQuery()) { + if (boTransactionResultSet.next()) { + BackOfficeTransaction boTransaction = mapResultSetToBoTransaction(boTransactionResultSet); + pos.setBoTransaction(boTransaction); + } else { + // Adjust to the desired behavior if no results are found + } + } + } catch (SQLException e) { + // Handle exception + } + } + } catch (SQLException e) { + e.printStackTrace(); + // Handle exceptions correctly in a production environment + } + + // Return the complete StoreDetails object + return storeDetails; + } + + private void retrieveStorePosDetails(DatabaseConnectXSTORE databaseConnection, Integer storeId, Integer workstationId, Date businessDate, StorePos pos) throws SQLException { + // Replication section + String replicationQuery = "SELECT COUNT(*) AS pendingReplications, " + + "MIN(crq.CREATE_DATE) AS minPendingReplicationDate, " + + "MAX(crq.CREATE_DATE) AS maxPendingReplicationDate " + + "FROM repqueue.CTL_REPLICATION_QUEUE crq " + + "WHERE crq.organization_id = 1 AND crq.RTL_LOC_ID = ? and crq.WKSTN_ID = ?"; + + logger.info(replicationQuery); + try (PreparedStatement replicationStatement = databaseConnection.getConnection().prepareStatement(replicationQuery)) { + replicationStatement.setInt(1, storeId); + replicationStatement.setInt(2, workstationId); + + try (ResultSet replicationResultSet = replicationStatement.executeQuery()) { + if (replicationResultSet.next()) { + PosReplication posReplication = mapResultSetToPosReplication(replicationResultSet); + pos.setReplication(posReplication); + } else { + // Adjust to the desired behavior if no results are found + } + } + } + + // opening transation section + String openingQuery = + "SELECT MIN(lsj.TIME_STAMP) AS minOpeningDate " + + "FROM loc_state_journal lsj " + + "WHERE lsj.TIME_STAMP BETWEEN TRUNC(SYSDATE) AND TRUNC(SYSDATE + 1) " + + "AND lsj.ORGANIZATION_ID = 1 " + + "AND lsj.RTL_LOC_ID = ? " + + "AND lsj.WKSTN_ID = ? " + + "AND lsj.STATUS_TYPCODE = 'WKSTN_STATE' " + + "AND lsj.STRING_VALUE = 'OPEN'"; + + logger.info(openingQuery); + try (PreparedStatement openingStatement = databaseConnection.getConnection().prepareStatement(openingQuery)) { + openingStatement.setInt(1, storeId); + openingStatement.setInt(2, workstationId); + + try (ResultSet openingResultSet = openingStatement.executeQuery()) { + if (openingResultSet.next()) { + pos.setOpeningDate(openingResultSet.getTimestamp("minOpeningDate")); + } else { + // Adjust to the desired behavior if no results are found + } + } + } + + // closing transation section + String closingQuery = + "SELECT MAX(lsj.TIME_STAMP) AS maxClosingDate " + + "FROM loc_state_journal lsj " + + "WHERE lsj.TIME_STAMP BETWEEN TRUNC(SYSDATE) AND TRUNC(SYSDATE + 1) " + + "AND lsj.ORGANIZATION_ID = 1 " + + "AND lsj.RTL_LOC_ID = ? " + + "AND lsj.WKSTN_ID = ? " + + "AND lsj.STATUS_TYPCODE = 'WKSTN_STATE' " + + "AND lsj.STRING_VALUE = 'CLOSED'"; + + logger.info(closingQuery); + try (PreparedStatement closingStatement = databaseConnection.getConnection().prepareStatement(closingQuery)) { + closingStatement.setInt(1, storeId); + closingStatement.setInt(2, workstationId); + + try (ResultSet closingResultSet = closingStatement.executeQuery()) { + if (closingResultSet.next()) { + pos.setClosingDate(closingResultSet.getTimestamp("maxClosingDate")); + } else { + // Adjust to the desired behavior if no results are found + } + } + } + + // sale transation section + String saleTransactionQuery = + "SELECT COUNT(*) AS counter, " + + "MIN(tt.END_DATETIME) AS minDate, " + + "MAX(tt.END_DATETIME) AS maxDate " + + "FROM dtv.trn_trans tt " + + "WHERE tt.ORGANIZATION_ID = 1 "+ + "AND tt.RTL_LOC_ID = ? " + + "AND tt.BUSINESS_DATE = ? " + + "AND tt.WKSTN_ID = ? " + + "AND tt.trans_TYPCODE = 'RETAIL_SALE' " + + "AND tt.TRANS_STATCODE = 'COMPLETE'"; + + logger.info(saleTransactionQuery); + try (PreparedStatement saleTransactionStatement = databaseConnection.getConnection().prepareStatement(saleTransactionQuery)) { + saleTransactionStatement.setInt(1, storeId); + saleTransactionStatement.setDate(2, pos.getBusinessDate()); + saleTransactionStatement.setInt(3, workstationId); + + try (ResultSet saleTransactionResultSet = saleTransactionStatement.executeQuery()) { + if (saleTransactionResultSet.next()) { + XstoreTransaction saleTransaction = mapResultSetToSaleTransaction(saleTransactionResultSet); + pos.setSaleTransaction(saleTransaction); + } else { + // Adjust to the desired behavior if no results are found + } + } + } + + // sale transation section + String logQuery = "SELECT COUNT(*) as counter " + + "FROM dtv.CTL_EVENT_LOG cel " + + "WHERE cel.CREATE_DATE BETWEEN TRUNC(SYSDATE) AND TRUNC(SYSDATE + 1) " + + "AND cel.ORGANIZATION_ID = 1 " + + "AND cel.RTL_LOC_ID = ? " + + "AND cel.WKSTN_ID = ? " + + "AND cel.LOG_LEVEL = 'FATAL'"; + + logger.info(logQuery); + try (PreparedStatement logStatement = databaseConnection.getConnection().prepareStatement(logQuery)) { + logStatement.setInt(1, storeId); + logStatement.setInt(2, workstationId); + + try (ResultSet logResultSet = logStatement.executeQuery()) { + if (logResultSet.next()) { + pos.setFatalError(logResultSet.getInt("counter")); + } else { + // Adjust to the desired behavior if no results are found + } + } + } + } + + private Store mapResultSetToStore(ResultSet resultSet) throws SQLException { + Integer id_structure = resultSet.getInt("id_structure"); + String nom = resultSet.getString("nom"); + String telephone = resultSet.getString("telephone"); + String photoLink = resultSet.getString("photoLink"); + String enseigne = resultSet.getString("enseigne"); + String pays = resultSet.getString("pays"); + String caisses = resultSet.getString("caisses"); + String adresse = resultSet.getString("adresse"); + Date date_migration = resultSet.getDate("date_migration"); + + return new Store(id_structure, nom, telephone, photoLink, enseigne, pays, caisses, adresse, date_migration); + } + + private PosReplication mapResultSetToPosReplication(ResultSet resultSet) throws SQLException { + int pendingReplications = resultSet.getInt("pendingReplications"); + Date minPendingReplicationDate = resultSet.getDate("minPendingReplicationDate"); + Date maxPendingReplicationDate = resultSet.getDate("maxPendingReplicationDate"); + + return new PosReplication(pendingReplications, minPendingReplicationDate, maxPendingReplicationDate); + } + + private XstoreTransaction mapResultSetToSaleTransaction(ResultSet resultSet) throws SQLException { + int count = resultSet.getInt("counter"); + Date minDate = resultSet.getDate("minDate"); + Date maxDate = resultSet.getDate("maxDate"); + + return new XstoreTransaction(count, minDate, maxDate); + } + + private BackOfficeTransaction mapResultSetToBoTransaction(ResultSet resultSet) throws SQLException { + int backofficeTransactions = resultSet.getInt("backOfficeTransactions"); + Date minBackofficeTransactionDate = resultSet.getDate("minBackOfficeTransactionDate"); + Date maxBackofficeTransactionDate = resultSet.getDate("maxBackOfficeTransactionDate"); + + return new BackOfficeTransaction(backofficeTransactions, minBackofficeTransactionDate, maxBackofficeTransactionDate); + } + + private StoreVersion mapResultSetToStoreVersion(ResultSet resultSet) throws SQLException { + long organizationId = resultSet.getLong("ORGANIZATION_ID"); + long seq = resultSet.getLong("SEQ"); + String baseSchemaVersion = resultSet.getString("BASE_SCHEMA_VERSION"); + String customerSchemaVersion = resultSet.getString("CUSTOMER_SCHEMA_VERSION"); + String customer = resultSet.getString("CUSTOMER"); + Date baseSchemaDate = resultSet.getDate("BASE_SCHEMA_DATE"); + Date customerSchemaDate = resultSet.getDate("CUSTOMER_SCHEMA_DATE"); + Date createDate= (resultSet.getDate("CREATE_DATE")); + String createUserId = resultSet.getString("CREATE_USER_ID"); + Date updateDate = (resultSet.getDate("UPDATE_DATE")); + String updateUserId =(resultSet.getString("UPDATE_USER_ID")); + + return new StoreVersion( organizationId, seq, baseSchemaVersion, customerSchemaVersion, customer, baseSchemaDate, customerSchemaDate, createDate, createUserId, updateDate, updateUserId); + } + + private StoreSequence mapResultSetToStoreSequence(ResultSet resultSet) throws SQLException { + long organizationId = resultSet.getLong("ORGANIZATION_ID"); + long rtl_loc_id = resultSet.getLong("RTL_LOC_ID"); + long wkstnId = resultSet.getLong("WKSTN_ID"); + String sequenceId = resultSet.getString("SEQUENCE_ID"); + String sequenceMode = resultSet.getString("SEQUENCE_MODE"); + Long sequenceNbr = resultSet.getLong("SEQUENCE_NBR"); + Date createDate = resultSet.getDate("CREATE_DATE"); + String createUserId = resultSet.getString("CREATE_USER_ID"); + Date updateDate = resultSet.getDate("UPDATE_DATE"); + String updateUserId = resultSet.getString("UPDATE_USER_ID"); + String recordState = resultSet.getString("RECORD_STATE"); + + return new StoreSequence(organizationId, rtl_loc_id, wkstnId, sequenceId, sequenceMode, sequenceNbr, createDate, createUserId, updateDate, updateUserId, recordState); + } + + private StoreSignature mapResultSetToStoreSignature(ResultSet resultSet) throws SQLException { + Long organizationId = resultSet.getLong("ORGANIZATION_ID"); + Long rtlLocId = resultSet.getLong("RTL_LOC_ID"); + Long wkstnId = resultSet.getLong("WKSTN_ID"); + String signatureId = resultSet.getString("SIGNATURE_ID"); + String signatureMode = resultSet.getString("SIGNATURE_MODE"); + String signatureString = resultSet.getString("SIGNATURE_STRING"); + String signatureSource = resultSet.getString("SIGNATURE_SOURCE"); + Date createDate = resultSet.getDate("CREATE_DATE"); + String createUserId = resultSet.getString("CREATE_USER_ID"); + Date updateDate = resultSet.getDate("UPDATE_DATE"); + String updateUserId = resultSet.getString("UPDATE_USER_ID"); + String recordState = resultSet.getString("RECORD_STATE"); + + return new StoreSignature(organizationId, rtlLocId, wkstnId, signatureId, signatureMode, signatureString, signatureSource, createDate, createUserId, updateDate, updateUserId, recordState); + } } diff --git a/src/main/java/com/example/services/XadminService.java b/src/main/java/com/example/services/XadminService.java new file mode 100644 index 0000000..049eb98 --- /dev/null +++ b/src/main/java/com/example/services/XadminService.java @@ -0,0 +1,170 @@ +package com.example.services; + +import com.example.services.xadmin.log.XadminLog; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Path("/xadmin") +public class XadminService { + private static final Logger logger = LoggerFactory.getLogger(DatabaseConnectXADMIN.class); + + @GET + @Path("/log") + @Produces(MediaType.APPLICATION_JSON) + public Response getLogByStoreId(@QueryParam("storeId") Integer storeId, + @QueryParam("wkstnId") Integer wkstnId, + @QueryParam("beginDate") String beginDate, + @QueryParam("endDate") String endDate, + @QueryParam("searchText") String searchText) { + + if (beginDate == null || endDate == null) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"BeginDate and EndDate parameters are required\"}").build(); + } + + DriverManager.setLoginTimeout(5); // Set timeout to 5 seconds + + try (DatabaseConnectXADMIN databaseConnection = new DatabaseConnectXADMIN("dtv")) { + String query = "SELECT" + + " FROM_TZ(cel.CREATE_DATE, 'UTC') " + + " AT TIME ZONE " + + " CASE loc.COUNTRY " + + " WHEN 'CH' THEN 'Europe/Zurich' " + + " WHEN 'NL' THEN 'Europe/Amsterdam' " + + " WHEN 'MC' THEN 'Europe/Monaco' " + + " WHEN 'LU' THEN 'Europe/Luxembourg' " + + " WHEN 'ES' THEN 'Europe/Madrid' " + + " WHEN 'FR' THEN 'Europe/Paris' " + + " WHEN 'US' THEN 'America/New_York' " + + " WHEN 'GB' THEN 'Europe/London' " + + " WHEN 'BE' THEN 'Europe/Brussels' " + + " ELSE 'UTC' " + + " END " + + "AS CREATE_DATE, " + + "cel.CREATE_USER_ID, " + + "cel.BUSINESS_DATE, " + + "cel.RTL_LOC_ID, " + + "cel.RTL_LOC_ID || ' - ' || loc.STORE_NAME AS STORE_NAME, " + + "cel.WKSTN_ID, " + + "cel.LOG_LEVEL, " + + "cel.THREAD_NAME, " + + "cel.LOG_MESSAGE, " + + "CASE WHEN cel.LOGGER_CATEGORY = 'dtv.xstore.app.preflight' THEN 'Pre-flight error' " + + " WHEN cel.LOGGER_CATEGORY LIKE 'dtv.xstore.dataloader%' THEN 'DataLoader' " + + " WHEN cel.LOGGER_CATEGORY = 'dtv.sysadmin.data.failover' THEN 'Data-failover' " + + " WHEN cel.LOGGER_CATEGORY = 'dtv.xstore.order.download.offline' THEN 'Order error' " + + " WHEN cel.LOGGER_CATEGORY = 'dtv.xstore.state.app.startup' THEN 'Xstore startup' " + + " WHEN cel.LOGGER_CATEGORY = 'dtv.xstore.state.app.shutdown' THEN 'Xstore shutdown' " + + " WHEN cel.LOGGER_CATEGORY = 'dtv.xstore.helpdesk.memory' THEN 'Application core' " + + " WHEN cel.LOGGER_CATEGORY = 'dtv.xstore.helpdesk' THEN 'Application core' " + + " WHEN cel.LOGGER_CATEGORY = 'dtv.sysadmin.data.repqueue.errors' THEN 'Replication errors' " + + " WHEN cel.LOGGER_CATEGORY = 'dtv.sysadmin.data.repqueue.nofails' THEN 'Replication errors' " + + " WHEN cel.LOGGER_CATEGORY = 'dtv.xstore.hardware.init' THEN 'Hardware init' " + + " WHEN cel.LOGGER_CATEGORY = 'dtv.xstore.sensitive-data.logging' THEN 'Sensitive data logging' " + + " WHEN cel.LOGGER_CATEGORY = 'dtv.xstore.uncaught' THEN 'Uncaught exception' " + + "ELSE cel.LOGGER_CATEGORY END as LOGGER_CATEGORY " + + "FROM dtv.CTL_EVENT_LOG cel " + + "JOIN dtv.LOC_RTL_LOC loc ON loc.RTL_LOC_ID = cel.RTL_LOC_ID " + + "WHERE cel.CREATE_DATE BETWEEN " + + "TO_TIMESTAMP(?, 'YYYYMMDD HH24:MI:SS') - INTERVAL '3' HOUR " + + "AND " + + "TO_TIMESTAMP(?, 'YYYYMMDD HH24:MI:SS') + INTERVAL '3' HOUR " + + "AND TO_CHAR(FROM_TZ(cel.CREATE_DATE, 'UTC') AT TIME ZONE " + + "CASE loc.COUNTRY " + + " WHEN 'CH' THEN 'Europe/Zurich' " + + " WHEN 'NL' THEN 'Europe/Amsterdam' " + + " WHEN 'MC' THEN 'Europe/Monaco' " + + " WHEN 'LU' THEN 'Europe/Luxembourg' " + + " WHEN 'ES' THEN 'Europe/Madrid' " + + " WHEN 'FR' THEN 'Europe/Paris' " + + " WHEN 'US' THEN 'America/New_York' " + + " WHEN 'GB' THEN 'Europe/London' " + + " WHEN 'BE' THEN 'Europe/Brussels' " + + " ELSE 'UTC' " + + "END, 'YYYYMMDD HH24:MI:SS') BETWEEN ? AND ? " + + "AND cel.ORGANIZATION_ID = 1 " + + (storeId != null ? "AND cel.RTL_LOC_ID = ? " : "") + + (wkstnId != null ? "AND cel.WKSTN_ID = ? " : "") + + (searchText != null ? "AND LOWER(cel.LOG_MESSAGE) LIKE ? " : "") + + "AND cel.THREAD_NAME IS NOT NULL " + + "ORDER BY cel.CREATE_DATE DESC"; + + logger.info(query); + try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query)) { + statement.setString(1, beginDate); + statement.setString(2, endDate + " 23:59:59"); + statement.setString(3, beginDate); + statement.setString(4, endDate + " 23:59:59"); + + Integer indexParam = 5; + + if (storeId != null) { + statement.setInt( indexParam++, storeId); + } + + if (wkstnId != null) { + statement.setInt(indexParam++,wkstnId); + } + + if(searchText != null) { + statement.setString(indexParam++, "%" + searchText.toLowerCase() + "%"); + } + + try (ResultSet resultSet = statement.executeQuery()) { + List xadminLogList = new ArrayList<>(); + + while (resultSet.next()) { + XadminLog xadminLog = mapResultSetToXadminLog(resultSet); + xadminLogList.add(xadminLog); + } + + ObjectMapper objectMapper = new ObjectMapper(); + String jsonResponse = objectMapper.writeValueAsString(xadminLogList); + + return Response.ok(jsonResponse).build(); + } + } + } catch (SQLException e) { + e.printStackTrace(); + String errorResponse = "{\"error\":\"" + e.getMessage() + "\"}"; + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorResponse).build(); + } catch (JsonProcessingException e) { + e.printStackTrace(); // Handle exceptions correctly in a production environment + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("{\"error\":\"Error processing JSON\"}").build(); + } + } + + public XadminLog mapResultSetToXadminLog(ResultSet resultSet) throws SQLException { + XadminLog xadminlog = new XadminLog(); + + xadminlog.setCreateDate(resultSet.getDate("CREATE_DATE")); + xadminlog.setCreateUserId(resultSet.getString("CREATE_USER_ID")); + xadminlog.setBusinessDate(resultSet.getDate("BUSINESS_DATE")); + xadminlog.setRtlLocId(resultSet.getInt("RTL_LOC_ID")); + xadminlog.setStoreName(resultSet.getString("STORE_NAME")); + xadminlog.setWkstnId(resultSet.getInt("WKSTN_ID")); + xadminlog.setLogLevel(resultSet.getString("LOG_LEVEL")); + xadminlog.setThreadName(resultSet.getString("THREAD_NAME")); + xadminlog.setLogMessage(resultSet.getString("LOG_MESSAGE")); + xadminlog.setLoggerCategory(resultSet.getString("LOGGER_CATEGORY")); + + return xadminlog; + } +} diff --git a/src/main/java/com/example/services/flux/bl/FluxBlNotSent.java b/src/main/java/com/example/services/flux/bl/FluxBlNotSent.java new file mode 100644 index 0000000..d8f49e0 --- /dev/null +++ b/src/main/java/com/example/services/flux/bl/FluxBlNotSent.java @@ -0,0 +1,206 @@ +package com.example.services.flux.bl; + +import java.sql.Date; +import java.text.SimpleDateFormat; + +public class FluxBlNotSent { + private Integer id_distrib; + private String libelle_dis; + private Integer id_structure; + private String nom_structure; + private String enseigne; + private String marque; + private String code_saison; + private String ref_r; + private String ref_rc; + private String ref_rct; + private String nom_produit; + private Integer id_produit; + private String code_externe; + private Integer id_bon_livraison; + private Date date_bl; + private Integer id_expediteur; + private String expediteur; + private String remarques; + + // Default constructor + public FluxBlNotSent() { + // Default constructor implementation + } + + // Constructor with parameters + public FluxBlNotSent(Integer idDistrib, String libelleDis, Integer idStructure, String nomStructure, + String enseigne, String marque, String codeSaison, String refR, + String refRc, String refRct, String nomProduit, Integer idProduit, + String codeExterne, Integer idBonLivraison, Date dateBl, + Integer idExpediteur, String expediteur, String remarques) { + this.id_distrib = idDistrib; + this.libelle_dis = libelleDis; + this.id_structure = idStructure; + this.nom_structure = nomStructure; + this.enseigne = enseigne; + this.marque = marque; + this.code_saison = codeSaison; + this.ref_r = refR; + this.ref_rc = refRc; + this.ref_rct = refRct; + this.nom_produit = nomProduit; + this.id_produit = idProduit; + this.code_externe = codeExterne; + this.id_bon_livraison = idBonLivraison; + this.date_bl = dateBl; + this.id_expediteur = idExpediteur; + this.expediteur = expediteur; + this.remarques = remarques; + } + + // getters and setters + public Integer getIdDistrib() { + return id_distrib; + } + + public void setIdDistrib(Integer idDistrib) { + this.id_distrib = idDistrib; + } + + public String getLibelleDis() { + return id_distrib + " - " + libelle_dis; + } + + public void setLibelleDis(String libelleDis) { + this.libelle_dis = libelleDis; + } + + public Integer getIdStructure() { + return id_structure; + } + + public void setIdStructure(Integer idStructure) { + this.id_structure = idStructure; + } + + public String getNomStructure() { + return id_structure + " - " + nom_structure; + } + + public void setNomStructure(String nom) { + this.nom_structure = nom; + } + + public String getEnseigne() { + return enseigne; + } + + public void setEnseigne(String enseigne) { + this.enseigne = enseigne; + } + + public String getMarque() { + return marque; + } + + public void setMarque(String marque) { + this.marque = marque; + } + + public String getCodeSaison() { + return code_saison; + } + + public void setCodeSaison(String codeSaison) { + this.code_saison = codeSaison; + } + + public String getRefR() { + return ref_r; + } + + public void setRefR(String refR) { + this.ref_r = refR; + } + + public String getRefRc() { + return ref_rc; + } + + public void setRefRc(String refRc) { + this.ref_rc = refRc; + } + + public String getRefRct() { + return ref_rct; + } + + public void setRefRct(String refRct) { + this.ref_rct = refRct; + } + + public String getNomProduit() { + return nom_produit; + } + + public void setNomProduit(String nomProduit) { + this.nom_produit = nomProduit; + } + + public Integer getIdProduit() { + return id_produit; + } + + public void setIdProduit(Integer idProduit) { + this.id_produit = idProduit; + } + + public String getCodeExterne() { + return code_externe; + } + + public void setCodeExterne(String codeExterne) { + this.code_externe = codeExterne; + } + + public Integer getIdBonLivraison() { + return id_bon_livraison; + } + + public void setIdBonLivraison(Integer idBonLivraison) { + this.id_bon_livraison = idBonLivraison; + } + + public String getDateBl() { + if (date_bl != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(date_bl); + } else { + return ""; + } + } + + public void setDateBl(Date dateBl) { + this.date_bl = dateBl; + } + + public Integer getIdExpediteur() { + return id_expediteur; + } + + public void setIdExpediteur(Integer idExpediteur) { + this.id_expediteur = idExpediteur; + } + + public String getExpediteur() { + return id_expediteur + " - " + expediteur; + } + + public void setExpediteur(String expediteur) { + this.expediteur = expediteur; + } + + public String getRemarques() { + return remarques; + } + + public void setRemarques(String remarques) { + this.remarques = remarques; + } +} diff --git a/src/main/java/com/example/services/item/Item.java b/src/main/java/com/example/services/item/Item.java new file mode 100644 index 0000000..aa41f64 --- /dev/null +++ b/src/main/java/com/example/services/item/Item.java @@ -0,0 +1,291 @@ +package com.example.services.item; + +import java.sql.Date; +import java.text.SimpleDateFormat; + + public class Item { + private Long organizationId; + private String itemId; + private String orgCode; + private String orgValue; + private String name; + private String description; + private String merchLevel1; + private String merchLevel2; + private String merchLevel3; + private String merchLevel4; + private Integer listPrice; + private Integer measureReqFlag; + private String itemLevelCode; + private String parentItemId; + private Integer notInventoriedFlag; + private Integer serializedItemFlag; + private String itemTypeCode; + private String dtvClassName; + private String dimensionSystem; + private Integer disallowMatrixDisplayFlag; + private String itemMatrixColor; + private String dimension1; + private String dimension2; + private String dimension3; + private String externalSystem; + private Date createDate; + private String createUserId; + private Date updateDate; + private String updateUserId; + + // Constructeur par défaut + public Item() { + // Default constructor required for JSON deserialization + } + + // Getters and Setters for all fields + + public Long getOrganizationId() { + return organizationId; + } + + public void setOrganizationId(Long organizationId) { + this.organizationId = organizationId; + } + + public String getItemId() { + return itemId; + } + + public void setItemId(String itemId) { + this.itemId = itemId; + } + + public String getOrgCode() { + return orgCode; + } + + public void setOrgCode(String orgCode) { + this.orgCode = orgCode; + } + + public String getOrgValue() { + return orgValue; + } + + public void setOrgValue(String orgValue) { + this.orgValue = orgValue; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getMerchLevel1() { + return merchLevel1; + } + + public void setMerchLevel1(String merchLevel1) { + this.merchLevel1 = merchLevel1; + } + + public String getMerchLevel2() { + return merchLevel2; + } + + public void setMerchLevel2(String merchLevel2) { + this.merchLevel2 = merchLevel2; + } + + public String getMerchLevel3() { + return merchLevel3; + } + + public void setMerchLevel3(String merchLevel3) { + this.merchLevel3 = merchLevel3; + } + + public String getMerchLevel4() { + return merchLevel4; + } + + public void setMerchLevel4(String merchLevel4) { + this.merchLevel4 = merchLevel4; + } + + public Integer getListPrice() { + return listPrice; + } + + public void setListPrice(Integer listPrice) { + this.listPrice = listPrice; + } + + public Integer getMeasureReqFlag() { + return measureReqFlag; + } + + public void setMeasureReqFlag(Integer measureReqFlag) { + this.measureReqFlag = measureReqFlag; + } + + public String getItemLevelCode() { + return itemLevelCode; + } + + public void setItemLevelCode(String itemLevelCode) { + this.itemLevelCode = itemLevelCode; + } + + public String getParentItemId() { + return parentItemId; + } + + public void setParentItemId(String parentItemId) { + this.parentItemId = parentItemId; + } + + public Integer getNotInventoriedFlag() { + return notInventoriedFlag; + } + + public void setNotInventoriedFlag(Integer notInventoriedFlag) { + this.notInventoriedFlag = notInventoriedFlag; + } + + public Integer getSerializedItemFlag() { + return serializedItemFlag; + } + + public void setSerializedItemFlag(Integer serializedItemFlag) { + this.serializedItemFlag = serializedItemFlag; + } + + public String getItemTypeCode() { + return itemTypeCode; + } + + public void setItemTypeCode(String itemTypeCode) { + this.itemTypeCode = itemTypeCode; + } + + public String getDtvClassName() { + return dtvClassName; + } + + public void setDtvClassName(String dtvClassName) { + this.dtvClassName = dtvClassName; + } + + public String getDimensionSystem() { + return dimensionSystem; + } + + public void setDimensionSystem(String dimensionSystem) { + this.dimensionSystem = dimensionSystem; + } + + public Integer getDisallowMatrixDisplayFlag() { + return disallowMatrixDisplayFlag; + } + + public void setDisallowMatrixDisplayFlag(Integer disallowMatrixDisplayFlag) { + this.disallowMatrixDisplayFlag = disallowMatrixDisplayFlag; + } + + public String getItemMatrixColor() { + return itemMatrixColor; + } + + public void setItemMatrixColor(String itemMatrixColor) { + this.itemMatrixColor = itemMatrixColor; + } + + public String getDimension1() { + return dimension1; + } + + public void setDimension1(String dimension1) { + this.dimension1 = dimension1; + } + + public String getDimension2() { + return dimension2; + } + + public void setDimension2(String dimension2) { + this.dimension2 = dimension2; + } + + public String getDimension3() { + return dimension3; + } + + public void setDimension3(String dimension3) { + this.dimension3 = dimension3; + } + + public String getExternalSystem() { + return externalSystem; + } + + public void setExternalSystem(String externalSystem) { + this.externalSystem = externalSystem; + } + + public String getCreateDate() { + if (createDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(createDate); + } else { + return ""; + } + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public String getCreateUserId() { + if (createUserId == null) { + return ""; + } + return createUserId; + } + + public void setCreateUserId(String createUserId) { + this.createUserId = createUserId; + } + + public String getUpdateDate() { + if (updateDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(updateDate); + } else { + return ""; + } + } + + public void setUpdateDate(Date updateDate) { + this.updateDate = updateDate; + } + + public String getUpdateUserId() { + if (updateUserId == null) { + return ""; + } + return updateUserId; + } + + public void setUpdateUserId(String updateUserId) { + this.updateUserId = updateUserId; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/services/item/ItemOption.java b/src/main/java/com/example/services/item/ItemOption.java new file mode 100644 index 0000000..41a172b --- /dev/null +++ b/src/main/java/com/example/services/item/ItemOption.java @@ -0,0 +1,130 @@ +package com.example.services.item; + +import java.sql.Date; +import java.text.SimpleDateFormat; + +public class ItemOption { + private String itemId; + private String levelCode; + private String levelValue; + private String itemAvailabilityCode; + private String taxGroupId; + private String vendor; + private String seasonCode; + private Date createDate; + private String createUserId; + private Date updateDate; + private String updateUserId; + + + public ItemOption() { + // Default constructor required for JSON deserialization + } + + // Getters and Setters for all fields + + public String getItemId() { + return itemId; + } + + public void setItemId(String itemId) { + this.itemId = itemId; + } + + public String getLevelCode() { + return levelCode; + } + + public void setLevelCode(String levelCode) { + this.levelCode = levelCode; + } + + public String getLevelValue() { + return levelValue; + } + + public void setLevelValue(String levelValue) { + this.levelValue = levelValue; + } + + public String getItemAvailabilityCode() { + return itemAvailabilityCode; + } + + public void setItemAvailabilityCode(String itemAvailabilityCode) { + this.itemAvailabilityCode = itemAvailabilityCode; + } + + public String getTaxGroupId() { + return taxGroupId; + } + + public void setTaxGroupId(String taxGroupId) { + this.taxGroupId = taxGroupId; + } + + public String getVendor() { + return vendor; + } + + public void setVendor(String vendor) { + this.vendor = vendor; + } + + public String getSeasonCode() { + return seasonCode; + } + + public void setSeasonCode(String seasonCode) { + this.seasonCode = seasonCode; + } + + public String getCreateDate() { + if (createDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(createDate); + } else { + return ""; + } + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public String getCreateUserId() { + if (createUserId == null) { + return ""; + } + return createUserId; + } + + public void setCreateUserId(String createUserId) { + this.createUserId = createUserId; + } + + public String getUpdateDate() { + if (updateDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(updateDate); + } else { + return ""; + } + } + + public void setUpdateDate(Date updateDate) { + this.updateDate = updateDate; + } + + public String getUpdateUserId() { + if (updateUserId == null) { + return ""; + } + return updateUserId; + } + + public void setUpdateUserId(String updateUserId) { + this.updateUserId = updateUserId; + } +} + diff --git a/src/main/java/com/example/services/item/ItemPrice.java b/src/main/java/com/example/services/item/ItemPrice.java new file mode 100644 index 0000000..af9fb47 --- /dev/null +++ b/src/main/java/com/example/services/item/ItemPrice.java @@ -0,0 +1,165 @@ +package com.example.services.item; + +import java.sql.Date; +import java.text.SimpleDateFormat; + +public class ItemPrice { + private String itemId; + private String levelCode; + private String levelValue; + private String itmPricePropertyCode; + private Date effectiveDate; + private Date expirationDate; + private Double price; + private Double priceQty; + private String externalId; + private String externalSystem; + private Date createDate; + private String createUserId; + private Date updateDate; + private String updateUserId; + + public ItemPrice() { + // Default constructor required for JSON deserialization + } + + // Getters and Setters for all fields + + public String getItemId() { + return itemId; + } + + public void setItemId(String itemId) { + this.itemId = itemId; + } + + public String getLevelCode() { + return levelCode; + } + + public void setLevelCode(String levelCode) { + this.levelCode = levelCode; + } + + public String getLevelValue() { + return levelValue; + } + + public void setLevelValue(String levelValue) { + this.levelValue = levelValue; + } + + public String getItmPricePropertyCode() { + return itmPricePropertyCode; + } + + public void setItmPricePropertyCode(String itmPricePropertyCode) { + this.itmPricePropertyCode = itmPricePropertyCode; + } + + public String getEffectiveDate() { + if (effectiveDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(effectiveDate); + } else { + return ""; + } + } + + public void setEffectiveDate(Date effectiveDate) { + this.effectiveDate = effectiveDate; + } + + public String getExpirationDate() { + if (expirationDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(expirationDate); + } else { + return ""; + } + } + + public void setExpirationDate(Date expirationDate) { + this.expirationDate = expirationDate; + } + + public Double getPrice() { + return price; + } + + public void setPrice(Double price) { + this.price = price; + } + + public Double getPriceQty() { + return priceQty; + } + + public void setPriceQty(Double priceQty) { + this.priceQty = priceQty; + } + + public String getExternalId() { + return externalId; + } + + public void setExternalId(String externalId) { + this.externalId = externalId; + } + + public String getExternalSystem() { + return externalSystem; + } + + public void setExternalSystem(String externalSystem) { + this.externalSystem = externalSystem; + } + + public String getCreateDate() { + if (createDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(createDate); + } else { + return ""; + } + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public String getCreateUserId() { + if (createUserId == null) { + return ""; + } + return createUserId; + } + + public void setCreateUserId(String createUserId) { + this.createUserId = createUserId; + } + + public String getUpdateDate() { + if (updateDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(updateDate); + } else { + return ""; + } + } + + public void setUpdateDate(Date updateDate) { + this.updateDate = updateDate; + } + + public String getUpdateUserId() { + if (updateUserId == null) { + return ""; + } + return updateUserId; + } + + public void setUpdateUserId(String updateUserId) { + this.updateUserId = updateUserId; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/services/item/ItemStock.java b/src/main/java/com/example/services/item/ItemStock.java new file mode 100644 index 0000000..8f2dbc9 --- /dev/null +++ b/src/main/java/com/example/services/item/ItemStock.java @@ -0,0 +1,122 @@ +package com.example.services.item; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class ItemStock { + private String organizationId; + private String rtlLocId; + private String invLocationId; + private String bucketId; + private String itemId; + private int unitCount; + private double inventoryValue; + private Date createDate; + private String createUserId; + private Date updateDate; + private String updateUserId; + + public String getOrganizationId() { + return organizationId; + } + + public void setOrganizationId(String organizationId) { + this.organizationId = organizationId; + } + + public String getRtlLocId() { + return rtlLocId; + } + + public void setRtlLocId(String rtlLocId) { + this.rtlLocId = rtlLocId; + } + + public String getInvLocationId() { + return invLocationId; + } + + public void setInvLocationId(String invLocationId) { + this.invLocationId = invLocationId; + } + + public String getBucketId() { + return bucketId; + } + + public void setBucketId(String bucketId) { + this.bucketId = bucketId; + } + + public String getItemId() { + return itemId; + } + + public void setItemId(String itemId) { + this.itemId = itemId; + } + + public int getUnitCount() { + return unitCount; + } + + public void setUnitCount(int unitCount) { + this.unitCount = unitCount; + } + + public double getInventoryValue() { + return inventoryValue; + } + + public void setInventoryValue(double inventoryValue) { + this.inventoryValue = inventoryValue; + } + + public String getCreateDate() { + if (createDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(createDate); + } else { + return ""; + } + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public String getCreateUserId() { + if (createUserId == null) { + return ""; + } + return createUserId; + } + + public void setCreateUserId(String createUserId) { + this.createUserId = createUserId; + } + + public String getUpdateDate() { + if (updateDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(updateDate); + } else { + return ""; + } + } + + public void setUpdateDate(Date updateDate) { + this.updateDate = updateDate; + } + + public String getUpdateUserId() { + if (updateUserId == null) { + return ""; + } + return updateUserId; + } + + public void setUpdateUserId(String updateUserId) { + this.updateUserId = updateUserId; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/services/store/BackOfficeTransaction.java b/src/main/java/com/example/services/store/BackOfficeTransaction.java new file mode 100644 index 0000000..74682ad --- /dev/null +++ b/src/main/java/com/example/services/store/BackOfficeTransaction.java @@ -0,0 +1,58 @@ +package com.example.services.store; + +import java.sql.Date; +import java.text.SimpleDateFormat; + +public class BackOfficeTransaction { + private int backOfficeTransactions; + private Date minBackOfficeTransactionDate; + private Date maxBackOfficeTransactionDate; + + + // Default constructor + public BackOfficeTransaction() { + // Default constructor required for JSON deserialization + } + + // Constructor with parameters + public BackOfficeTransaction(int backOfficeTransactions, Date minbackOfficeTransactionDate, Date maxbackOfficeTransactionDate) { + this.backOfficeTransactions = backOfficeTransactions; + this.minBackOfficeTransactionDate = minbackOfficeTransactionDate; + this.maxBackOfficeTransactionDate = maxbackOfficeTransactionDate; + } + + // Getters et setters + public int getBackOfficeTransactions() { + return backOfficeTransactions; + } + + public void setBackOfficeTransactions(int backOfficeTransactions) { + this.backOfficeTransactions = backOfficeTransactions; + } + + public String getMinBackOfficeTransactionDate() { + if (minBackOfficeTransactionDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(minBackOfficeTransactionDate); + } else { + return ""; + } + } + + public void setMinBackOfficeTransactionDate(Date minBackOfficeTransactionDate) { + this.minBackOfficeTransactionDate = minBackOfficeTransactionDate; + } + + public String getMaxBackOfficeTransactionDate() { + if (maxBackOfficeTransactionDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(maxBackOfficeTransactionDate); + } else { + return ""; + } + } + + public void setMaxBackOfficeTransactionDate(Date maxBackOfficeTransactionDate) { + this.maxBackOfficeTransactionDate = maxBackOfficeTransactionDate; + } +} diff --git a/src/main/java/com/example/services/store/PosReplication.java b/src/main/java/com/example/services/store/PosReplication.java new file mode 100644 index 0000000..d72d23a --- /dev/null +++ b/src/main/java/com/example/services/store/PosReplication.java @@ -0,0 +1,58 @@ +package com.example.services.store; + +import java.sql.Date; +import java.text.SimpleDateFormat; + +public class PosReplication { + private int pendingReplications; + private Date minPendingReplicationDate; + private Date maxPendingReplicationDate; + + // Default constructor + public PosReplication() { + // Default constructor required for JSON deserialization + } + + // Constructor with parameters + public PosReplication(int pendingReplications, Date minPendingReplicationDate, Date maxPendingReplicationDate) { + this.pendingReplications = pendingReplications; + this.minPendingReplicationDate = minPendingReplicationDate; + this.maxPendingReplicationDate = maxPendingReplicationDate; + } + + // Getters et setters + public int getPendingReplications() { + return pendingReplications; + } + + public void setPendingReplications(int pendingReplications) { + this.pendingReplications = pendingReplications; + } + + public String getMinPendingReplicationDate() { + if (minPendingReplicationDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(minPendingReplicationDate); + } else { + return ""; + } + } + + public void setMinReplicationDate(Date minPendingReplicationDate) { + this.minPendingReplicationDate = minPendingReplicationDate; + } + + public String getMaxPendingReplicationDate() { + if (maxPendingReplicationDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(maxPendingReplicationDate); + } else { + return ""; + } + } + + + public void setMaxReplicationDate(Date maxPendingReplicationDate) { + this.maxPendingReplicationDate = maxPendingReplicationDate; + } +} diff --git a/src/main/java/com/example/services/store/Store.java b/src/main/java/com/example/services/store/Store.java new file mode 100644 index 0000000..6f5b947 --- /dev/null +++ b/src/main/java/com/example/services/store/Store.java @@ -0,0 +1,162 @@ +package com.example.services.store; + +import java.sql.Date; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +public class Store { + private Integer id_structure; + private String nom; + private String ip_master; + private String telephone; + private String photoLink; + private String enseigne; + private String pays; + private Integer nbcaisses; + private String adresse; + private List caisses; + private Date date_migration; + + // Default constructor + public Store() { + // Default constructor required for JSON deserialization + } + + // Constructor with parameters + public Store(Integer id_structure, String nom, String telephone, String photoLink, String enseigne, String pays, String caisses, String adresse, Date date_migration) { + this.id_structure = id_structure; + this.nom = nom; + this.telephone = telephone; + this.photoLink = photoLink; + this.enseigne = enseigne; + this.pays = pays; + this.adresse = adresse; + this.date_migration = date_migration; + + setCaisses(caisses); + } + + public Integer getId_structure() { + return id_structure; + } + + public void setId_structure(Integer id_structure) { + this.id_structure = id_structure; + } + + public String getNom() { + return nom; + } + + public void setNom(String nom) { + this.nom = nom; + } + + public String getIp_master() { + if (!this.caisses.isEmpty()) { + return this.caisses.get(0).getIp(); + } + + return ""; + } + + public String getTelephone() { + return telephone; + } + + public void setTelephone(String telephone) { + this.telephone = telephone; + } + + public String getPhotoLink() { + return photoLink; + } + + public void setPhotoLink(String photoLink) { + this.photoLink = photoLink; + } + + public String getEnseigne() { + return enseigne; + } + + public void setEnseigne(String enseigne) { + this.enseigne = enseigne; + } + + public String getPays() { + return pays; + } + + public void setPays(String pays) { + this.pays = pays; + } + + public Integer getNbcaisses() { + return this.caisses.size(); + } + + public void setAdresse(String adresse) { + this.adresse = adresse; + } + + public String getAdresse() { + return this.adresse; + } + + public List getCaisses() { + return this.caisses; + } + + public void setCaisses(String caisses) { + this.caisses = new ArrayList<>(); + for (String caisse : caisses.split(",")) { + String[] parts = caisse.split("\\|"); + this.caisses.add(new Caisse(Integer.parseInt(parts[0]), parts[1])); + } + + Collections.sort(this.caisses, Comparator.comparing(Caisse::getId_caisse)); + } + + public String getDate_migration() { + if (date_migration != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(date_migration); + } else { + return ""; + } + } + + public void setDate_migration(Date date_migration) { + this.date_migration = date_migration; + } + + public class Caisse { + private Integer id_caisse; + private String ip; + + public Caisse(Integer id_caisse, String ip) { + this.id_caisse = id_caisse; + this.ip = ip; + } + + public Integer getId_caisse() { + return id_caisse; + } + + public void setId_caisse(Integer id_caisse) { + this.id_caisse = id_caisse; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + } +} diff --git a/src/main/java/com/example/services/store/StoreDetails.java b/src/main/java/com/example/services/store/StoreDetails.java new file mode 100644 index 0000000..7229881 --- /dev/null +++ b/src/main/java/com/example/services/store/StoreDetails.java @@ -0,0 +1,36 @@ +package com.example.services.store; + +import java.util.ArrayList; +import java.util.List; + +public class StoreDetails { + private Store store; + private List pos; + + public StoreDetails() { + // Constructeur par défaut nécessaire pour la désérialisation JSON + this.pos = new ArrayList<>(); + } + + public StoreDetails(Store store, List pos) { + this.store = store; + this.pos = pos != null ? pos : new ArrayList<>(); + } + + public Store getStore() { + return store; + } + + public void setStore(Store store) { + this.store = store; + } + + public List getPos() { + return pos; + } + + public void setPos(List pos) { + this.pos = pos; + } +} + diff --git a/src/main/java/com/example/services/store/StorePos.java b/src/main/java/com/example/services/store/StorePos.java new file mode 100644 index 0000000..b10be78 --- /dev/null +++ b/src/main/java/com/example/services/store/StorePos.java @@ -0,0 +1,138 @@ +package com.example.services.store; + +import java.sql.Date; +import java.text.SimpleDateFormat; + +public class StorePos { + private int workstationId; + private String ip; + private String version; + private Date businessDate; + private String openingDate; + private String closingDate; + private BackOfficeTransaction boTransaction; + private PosReplication replication; + private XstoreTransaction saleTransaction; + private boolean primaryRegister = false; + private boolean fatalError = false; + + // Default constructor + public StorePos() { + // Default constructor required for JSON deserialization + } + + // Constructor with parameters + public StorePos( int workstationId, String ip, String version, Date businessDate, String openingDate, String closingDate ,BackOfficeTransaction boTransaction, PosReplication replication, XstoreTransaction saleTransaction, boolean primaryRegister, boolean fatalError) { + this.workstationId = workstationId; + this.ip = ip; + this.version = version; + this.businessDate = businessDate; + this.openingDate = openingDate; + this.closingDate = closingDate; + this.boTransaction = boTransaction; + this.replication = replication; + this.saleTransaction = saleTransaction; + this.primaryRegister = primaryRegister; + this.fatalError = fatalError; + } + // Getters et setters + public int getWorkstationId() { + return workstationId; + } + public void setWorkstationId(int workstationId) { + this.workstationId = workstationId; + } + public String getIp() { + return ip; + } + public void setIp(String ip) { + this.ip = ip; + } + public String getVersion() { + return version; + } + public void setVersion(String version) { + this.version = version; + } + + public String getBusinessDateS() { + if (businessDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); + return dateFormat.format(businessDate); + } else { + return ""; + } + } + + public Date getBusinessDate() { + return businessDate; + } + + public void setBusinessDate(Date businessDate) { + this.businessDate = businessDate; + } + + public String getOpeningDate() { + return openingDate; + } + + public void setOpeningDate(java.sql.Timestamp openingDate) { + if (openingDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + String strOpeningDate = dateFormat.format(openingDate); + this.openingDate = strOpeningDate; + } + } + + public String getClosingDate() { + return closingDate; + } + + public void setClosingDate(java.sql.Timestamp closingDate) { + if (closingDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + String strClosingDate = dateFormat.format(closingDate); + this.closingDate = strClosingDate; + } + } + + public BackOfficeTransaction getBoTransaction() { + return boTransaction; + } + + public void setBoTransaction(BackOfficeTransaction boTransaction) { + this.boTransaction = boTransaction; + } + + public PosReplication getReplication() { + return replication; + } + + public void setReplication(PosReplication replication) { + this.replication = replication; + } + + public XstoreTransaction getSaleTransaction() { + return saleTransaction; + } + + public void setSaleTransaction(XstoreTransaction saleTransaction) { + this.saleTransaction = saleTransaction; + } + + public boolean isPrimaryRegister() { + return primaryRegister; + } + + public void setPrimaryRegister(int primaryRegister) { + this.primaryRegister = (primaryRegister == 1); + } + + public boolean isFatalError() { + return fatalError; + } + + public void setFatalError(int fatalError) { + this.fatalError = (fatalError > 0); + } +} diff --git a/src/main/java/com/example/services/store/StoreSequence.java b/src/main/java/com/example/services/store/StoreSequence.java new file mode 100644 index 0000000..abd3754 --- /dev/null +++ b/src/main/java/com/example/services/store/StoreSequence.java @@ -0,0 +1,137 @@ +package com.example.services.store; + +import java.util.Date; +import java.text.SimpleDateFormat; + +public class StoreSequence { + private Long organizationId; + private Long rtlLocId; + private Long wkstnId; + private String sequenceId; + private String sequenceMode; + private Long sequenceNbr; + private Date createDate; + private String createUserId; + private Date updateDate; + private String updateUserId; + private String recordState; + + // Default constructor + public StoreSequence() { + // Default constructor required for JSON deserialization + } + + public StoreSequence(Long organizationId, Long rtlLocId, Long wkstnId, String sequenceId, String sequenceMode, Long sequenceNbr, Date createDate, String createUserId, Date updateDate, String updateUserId, String recordState) { + this.organizationId = organizationId; + this.rtlLocId = rtlLocId; + this.wkstnId = wkstnId; + this.sequenceId = sequenceId; + this.sequenceMode = sequenceMode; + this.sequenceNbr = sequenceNbr; + this.createDate = createDate; + this.createUserId = createUserId; + this.updateDate = updateDate; + this.updateUserId = updateUserId; + this.recordState = recordState; + } + + // Getters and Setters for all fields + + public Long getOrganizationId() { + return organizationId; + } + + public void setOrganizationId(Long organizationId) { + this.organizationId = organizationId; + } + + public Long getRtlLocId() { + return rtlLocId; + } + + public void setRtlLocId(Long rtlLocId) { + this.rtlLocId = rtlLocId; + } + + public Long getWkstnId() { + return wkstnId; + } + + public void setWkstnId(Long wkstnId) { + this.wkstnId = wkstnId; + } + + public String getSequenceId() { + return sequenceId; + } + + public void setSequenceId(String sequenceId) { + this.sequenceId = sequenceId; + } + + public String getSequenceMode() { + return sequenceMode; + } + + public void setSequenceMode(String sequenceMode) { + this.sequenceMode = sequenceMode; + } + + public Long getSequenceNbr() { + return sequenceNbr; + } + + public void setSequenceNbr(Long sequenceNbr) { + this.sequenceNbr = sequenceNbr; + } + + public String getCreateDate() { + if (createDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(createDate); + } else { + return ""; + } + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public String getCreateUserId() { + return createUserId == null ? "" : createUserId; + } + + public void setCreateUserId(String createUserId) { + this.createUserId = createUserId; + } + + public String getUpdateDate() { + if (updateDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(updateDate); + } else { + return ""; + } + } + + public void setUpdateDate(Date updateDate) { + this.updateDate = updateDate; + } + + public String getUpdateUserId() { + return updateUserId == null ? "" : updateUserId; + } + + public void setUpdateUserId(String updateUserId) { + this.updateUserId = updateUserId; + } + + public String getRecordState() { + return recordState; + } + + public void setRecordState(String recordState) { + this.recordState = recordState; + } +} diff --git a/src/main/java/com/example/services/store/StoreSignature.java b/src/main/java/com/example/services/store/StoreSignature.java new file mode 100644 index 0000000..3a5106e --- /dev/null +++ b/src/main/java/com/example/services/store/StoreSignature.java @@ -0,0 +1,155 @@ +package com.example.services.store; + +import java.util.Date; +import java.text.SimpleDateFormat; + +public class StoreSignature { + private Long organizationId; + private Long rtlLocId; + private Long wkstnId; + private String signatureId; + private String signatureMode; + private String signatureString; + private String signatureSource; + private Date createDate; + private String createUserId; + private Date updateDate; + private String updateUserId; + private String recordState; + + // Default constructor + public StoreSignature() { + // Default constructor required for JSON deserialization + } + + public StoreSignature(Long organizationId, Long rtlLocId, Long wkstnId, String signatureId, String signatureMode, String signatureString, String signatureSource, Date createDate, String createUserId, Date updateDate, String updateUserId, String recordState) { + this.organizationId = organizationId; + this.rtlLocId = rtlLocId; + this.wkstnId = wkstnId; + this.signatureId = signatureId; + this.signatureMode = signatureMode; + this.signatureString = signatureString; + this.signatureSource = signatureSource; + this.createDate = createDate; + this.createUserId = createUserId; + this.updateDate = updateDate; + this.updateUserId = updateUserId; + this.recordState = recordState; + } + + // Getters and Setters for all fields + + public Long getOrganizationId() { + return organizationId; + } + + public void setOrganizationId(Long organizationId) { + this.organizationId = organizationId; + } + + public Long getRtlLocId() { + return rtlLocId; + } + + public void setRtlLocId(Long rtlLocId) { + this.rtlLocId = rtlLocId; + } + + public Long getWkstnId() { + return wkstnId; + } + + public void setWkstnId(Long wkstnId) { + this.wkstnId = wkstnId; + } + + public String getSignatureId() { + return signatureId; + } + + public void setSignatureId(String signatureId) { + this.signatureId = signatureId; + } + + public String getSignatureMode() { + return signatureMode; + } + + public void setSignatureMode(String signatureMode) { + this.signatureMode = signatureMode; + } + + public String getSignatureString() { + if (signatureString != null) { + return signatureString; + } else { + return ""; + } + } + + public void setSignatureString(String signatureString) { + this.signatureString = signatureString; + } + + public String getSignatureSource() { + if (signatureSource != null) { + return signatureSource; + } else { + return ""; + } + } + + public void setSignatureSource(String signatureSource) { + this.signatureSource = signatureSource; + } + + public String getCreateDate() { + if (createDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(createDate); + } else { + return ""; + } + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public String getCreateUserId() { + return createUserId; + } + + public void setCreateUserId(String createUserId) { + this.createUserId = createUserId; + } + + public String getUpdateDate() { + if (updateDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(updateDate); + } else { + return ""; + } + } + + public void setUpdateDate(Date updateDate) { + this.updateDate = updateDate; + } + + public String getUpdateUserId() { + return updateUserId; + } + + public void setUpdateUserId(String updateUserId) { + this.updateUserId = updateUserId; + } + + public String getRecordState() { + return recordState; + } + + public void setRecordState(String recordState) { + this.recordState = recordState; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/services/store/StoreVersion.java b/src/main/java/com/example/services/store/StoreVersion.java new file mode 100644 index 0000000..302f2ae --- /dev/null +++ b/src/main/java/com/example/services/store/StoreVersion.java @@ -0,0 +1,147 @@ +package com.example.services.store; + +import java.sql.Date; +import java.text.SimpleDateFormat; + +public class StoreVersion { + private Long organizationId; + private Long seq; + private String baseSchemaVersion; + private String customerSchemaVersion; + private String customer; + private Date baseSchemaDate; + private Date customerSchemaDate; + private Date createDate; + private String createUserId; + private Date updateDate; + private String updateUserId; + + // Default constructor + public StoreVersion() { + // Default constructor required for JSON deserialization + } + + public StoreVersion(Long organisation_id, Long seq, String base_schema_version, String customer_schema_version, String customer, Date base_schema_date, Date customer_schema_date, Date createDate, String create_user_id, Date update_date, String update_user_id) { + this.organizationId = organisation_id; + this.seq = seq; + this.baseSchemaVersion = base_schema_version; + this.customerSchemaVersion = customer_schema_version; + this.customer = customer; + this.baseSchemaDate = base_schema_date; + this.customerSchemaDate = customer_schema_date; + this.createDate = createDate; + this.createUserId = create_user_id; + this.updateDate = update_date; + this.updateUserId = update_user_id; + }; + + // Getters and Setters for all fields + + public Long getOrganizationId() { + return organizationId; + } + + public void setOrganizationId(Long organizationId) { + this.organizationId = organizationId; + } + + public Long getSeq() { + return seq; + } + + public void setSeq(Long seq) { + this.seq = seq; + } + + public String getBaseSchemaVersion() { + return baseSchemaVersion; + } + + public void setBaseSchemaVersion(String baseSchemaVersion) { + this.baseSchemaVersion = baseSchemaVersion; + } + + public String getCustomerSchemaVersion() { + return customerSchemaVersion; + } + + public void setCustomerSchemaVersion(String customerSchemaVersion) { + this.customerSchemaVersion = customerSchemaVersion; + } + + public String getCustomer() { + return customer; + } + + public void setCustomer(String customer) { + this.customer = customer; + } + + public String getBaseSchemaDate() { + if (baseSchemaDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(baseSchemaDate); + } else { + return ""; + } + } + + public void setBaseSchemaDate(Date baseSchemaDate) { + this.baseSchemaDate = baseSchemaDate; + } + + public String getCustomerSchemaDate() { + if (customerSchemaDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(customerSchemaDate); + } else { + return ""; + } + } + + public void setCustomerSchemaDate(Date customerSchemaDate) { + this.customerSchemaDate = customerSchemaDate; + } + + public String getCreateDate() { + if (createDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(createDate); + } else { + return ""; + } + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public String getCreateUserId() { + return createUserId; + } + + public void setCreateUserId(String createUserId) { + this.createUserId = createUserId; + } + + public String getUpdateDate() { + if (updateDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(updateDate); + } else { + return ""; + } + } + + public void setUpdateDate(Date updateDate) { + this.updateDate = updateDate; + } + + public String getUpdateUserId() { + return updateUserId; + } + + public void setUpdateUserId(String updateUserId) { + this.updateUserId = updateUserId; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/services/store/XstoreTransaction.java b/src/main/java/com/example/services/store/XstoreTransaction.java new file mode 100644 index 0000000..830b310 --- /dev/null +++ b/src/main/java/com/example/services/store/XstoreTransaction.java @@ -0,0 +1,98 @@ +package com.example.services.store; + +import java.sql.Date; +import java.text.SimpleDateFormat; + +public class XstoreTransaction { + private int count; + private Date minDate; + private Date maxDate; + private String minDateT; + private String minDateH; + private String maxDateT; + private String maxDateH; + + // Default constructor + public XstoreTransaction() { + // Default constructor required for JSON deserialization + } + + // Constructor with parameters + public XstoreTransaction(int count, Date minDate, Date maxDate) { + this.count = count; + this.minDate = minDate; + this.maxDate = maxDate; + } + + // Getters et setters + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public String getMinDate() { + if (minDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(minDate); + } else { + return ""; + } + } + + public void setMinDate(Date minDate) { + this.minDate = minDate; + } + + public String getMaxDate() { + if (maxDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(maxDate); + } else { + return ""; + } + } + + public void setMaxDate(Date maxDate) { + this.maxDate = maxDate; + } + + public String getMinDateT() { + if (minDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); + return dateFormat.format(minDate); + } else { + return ""; + } + } + + public String getMinDateH() { + if (minDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + return dateFormat.format(minDate); + } else { + return ""; + } + } + + public String getMaxDateT() { + if (maxDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); + return dateFormat.format(maxDate); + } else { + return ""; + } + } + + public String getMaxDateH() { + if (maxDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + return dateFormat.format(maxDate); + } else { + return ""; + } + } +} diff --git a/src/main/java/com/example/services/xadmin/log/XadminLog.java b/src/main/java/com/example/services/xadmin/log/XadminLog.java new file mode 100644 index 0000000..20ba196 --- /dev/null +++ b/src/main/java/com/example/services/xadmin/log/XadminLog.java @@ -0,0 +1,96 @@ +package com.example.services.xadmin.log; + +import java.util.Date; + +public class XadminLog { + private Date businessDate; + private Date createDate; + private String createUserId; + private Integer rtlLocId; + private Integer wkstnId; + private String logLevel; + private String threadName; + private String logMessage; + private String loggerCategory; + private String storeName; + + public Date getBusinessDate() { + return businessDate; + } + + public void setBusinessDate(Date businessDate) { + this.businessDate = businessDate; + } + + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public String getCreateUserId() { + return createUserId; + } + + public void setCreateUserId(String createUserId) { + this.createUserId = createUserId; + } + + public Integer getRtlLocId() { + return rtlLocId; + } + + public void setRtlLocId(Integer rtlLocId) { + this.rtlLocId = rtlLocId; + } + + public Integer getWkstnId() { + return wkstnId; + } + + public void setWkstnId(Integer wkstnId) { + this.wkstnId = wkstnId; + } + + public String getLogLevel() { + return logLevel; + } + + public void setLogLevel(String logLevel) { + this.logLevel = logLevel; + } + + public String getThreadName() { + return threadName; + } + + public void setThreadName(String threadName) { + this.threadName = threadName; + } + + public String getLogMessage() { + return logMessage; + } + + public void setLogMessage(String logMessage) { + this.logMessage = logMessage; + } + + public String getLoggerCategory() { + return loggerCategory; + } + + public void setLoggerCategory(String loggerCategory) { + this.loggerCategory = loggerCategory; + } + + public String getStoreName() { + return storeName; + } + + public void setStoreName(String storeName) { + this.storeName = storeName; + } +} diff --git a/src/main/resources/db.properties b/src/main/resources/db.properties new file mode 100644 index 0000000..e9410c6 --- /dev/null +++ b/src/main/resources/db.properties @@ -0,0 +1,23 @@ +# Development environment settings (dev) +dev.db.url=jdbc:oracle:thin:@v-aspd-b01-irdc.adic.lan:1521/MASPDI +dev.db.oai.password=base +dev.db.com02.password=B1Xto9pAbtBCOxuecG7W + +# Pre-production environment settings (preprod) +preprod.db.url=jdbc:oracle:thin:@v-aspd-b01-ii-d.adic.lan:1521/IASPDI +preprod.db.oai.password=base +preprod.db.com02.password=B1Xto9pAbtBCOxuecG7W + +# Production environment settings (prod) +prod.db.url=jdbc:oracle:thin:@v-aspd-b03-ip-d.adic.lan:1521/PASPDI +prod.db.oai.password=base +prod.db.com02.password=com20 + +# XSTORE environment settings +xstore.db.url=jdbc:oracle:thin:@HOST:1521/XSTORE +xstore.db.dtv.password=dtv +xstore.db.repqueue.password=repqueue + +# XADMIN environment settings +xadmin.db.url=jdbc:oracle:thin:@p-ODBG-b01-ipDC.tech.ikks.lan:1522/PXSTOREI +xadmin.db.dtv.password=oY3poRSprOuqasO \ No newline at end of file diff --git a/src/main/resources/env.properties b/src/main/resources/env.properties new file mode 100644 index 0000000..e30e658 --- /dev/null +++ b/src/main/resources/env.properties @@ -0,0 +1,2 @@ +# Indicates the current environment (dev, preprod, prod, etc.). +environment=prod \ No newline at end of file diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml new file mode 100644 index 0000000..c126aed --- /dev/null +++ b/src/main/resources/logback.xml @@ -0,0 +1,12 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 7cc252d..21d9ef3 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -15,6 +15,10 @@ jersey.config.server.provider.packages com.example.services + + jersey.config.server.provider.classnames + org.glassfish.jersey.jackson.JacksonFeature + 1