From 8256f2c8a6c52c1d87cb3e0231bc5d65c276d3ca Mon Sep 17 00:00:00 2001 From: fbenoist68 Date: Sat, 18 Nov 2023 09:08:44 +0100 Subject: [PATCH 01/16] refactor: database connection and add Store class --- pom.xml | 24 +- .../services/DatabaseConnectDOTSOFT.java | 62 +++++ .../services/DatabaseConnectXSTORE.java | 57 +++++ .../example/services/DatabaseConnection.java | 26 --- .../services/DatabaseConnectionDS.java | 28 --- .../com/example/services/DatabaseService.java | 2 +- .../com/example/services/HelloWebService.java | 2 +- .../com/example/services/ItemService.java | 2 +- .../com/example/services/StoreService.java | 211 +++++++++++++----- .../com/example/services/store/Store.java | 62 +++++ .../example/services/store/StoreDetails.java | 44 ++++ .../services/store/StoreReplication.java | 55 +++++ .../example/services/store/StoreTicket.java | 35 +++ src/main/resources/db.properties | 19 ++ src/main/resources/env.properties | 2 + src/main/resources/logback.xml | 12 + 16 files changed, 533 insertions(+), 110 deletions(-) create mode 100644 src/main/java/com/example/services/DatabaseConnectDOTSOFT.java create mode 100644 src/main/java/com/example/services/DatabaseConnectXSTORE.java delete mode 100644 src/main/java/com/example/services/DatabaseConnection.java delete mode 100644 src/main/java/com/example/services/DatabaseConnectionDS.java create mode 100644 src/main/java/com/example/services/store/Store.java create mode 100644 src/main/java/com/example/services/store/StoreDetails.java create mode 100644 src/main/java/com/example/services/store/StoreReplication.java create mode 100644 src/main/java/com/example/services/store/StoreTicket.java create mode 100644 src/main/resources/db.properties create mode 100644 src/main/resources/env.properties create mode 100644 src/main/resources/logback.xml diff --git a/pom.xml b/pom.xml index 29ebc22..74cddc5 100644 --- a/pom.xml +++ b/pom.xml @@ -44,7 +44,7 @@ javax.servlet javax.servlet-api - 4.0.1 + 4.0.1 provided @@ -52,9 +52,29 @@ com.fasterxml.jackson.core jackson-databind - 2.13.0 + 2.13.0 + + + ch.qos.logback + logback-core + 1.4.11 + + + + + ch.qos.logback + logback-classic + 1.4.11 + + + + + org.slf4j + slf4j-api + 2.0.9 + 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..5e5f2b4 --- /dev/null +++ b/src/main/java/com/example/services/DatabaseConnectDOTSOFT.java @@ -0,0 +1,62 @@ +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(); + 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); + } + + 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/DatabaseConnectXSTORE.java b/src/main/java/com/example/services/DatabaseConnectXSTORE.java new file mode 100644 index 0000000..7258fb9 --- /dev/null +++ b/src/main/java/com/example/services/DatabaseConnectXSTORE.java @@ -0,0 +1,57 @@ +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 { + Properties dbProperties = loadDatabaseProperties(); + + String url = dbProperties.getProperty("xstore.db.url").replace("HOST", dbHost); + String userpassword = dbProperties.getProperty("xstore.db." + username + ".password"); + + // Initialiser votre connexion à la base de données ici + connection = DriverManager.getConnection(url, username, userpassword); + + logger.info("XSTORE Connection OK for user " + username + " on host " + dbHost); + } + + 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 index 34803cc..9fbbf05 100644 --- a/src/main/java/com/example/services/DatabaseService.java +++ b/src/main/java/com/example/services/DatabaseService.java @@ -26,7 +26,7 @@ public class DatabaseService { DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes - try (DatabaseConnection databaseConnection = new DatabaseConnection(dbHost, "repqueue", "repqueue")) { + try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost, "repqueue")) { String query = "SELECT COUNT(*) FROM CTL_REPLICATION_QUEUE"; try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query); 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..5a69d6a 100644 --- a/src/main/java/com/example/services/ItemService.java +++ b/src/main/java/com/example/services/ItemService.java @@ -38,7 +38,7 @@ public class ItemService { DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes - try (DatabaseConnection databaseConnection = new DatabaseConnection(dbHost, "dtv", "dtv")) { + try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost, "dtv")) { String query = "SELECT * FROM ITM_ITEM WHERE ITEM_ID LIKE ?" ; try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query)) { diff --git a/src/main/java/com/example/services/StoreService.java b/src/main/java/com/example/services/StoreService.java index 555e9d5..9859515 100644 --- a/src/main/java/com/example/services/StoreService.java +++ b/src/main/java/com/example/services/StoreService.java @@ -1,5 +1,7 @@ package com.example.services; +import com.example.services.store.*; + import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; @@ -22,9 +24,15 @@ import java.util.concurrent.locks.ReentrantLock; @Path("/stores") public class StoreService { - private static List cachedStoreList; + 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") @Produces(MediaType.APPLICATION_JSON) @@ -35,9 +43,7 @@ public class StoreService { DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes - // IASPDI com02 / B1Xto9pAbtBCOxuecG7W - // MASPDI com02 / - try (DatabaseConnectionDS databaseConnection = new DatabaseConnectionDS("com02", "B1Xto9pAbtBCOxuecG7W")) { + try (DatabaseConnectDOTSOFT databaseConnection = new DatabaseConnectDOTSOFT("com02")) { String query = "SELECT id_structure,nom,'10.100.0.18' AS ip, tel1 AS telephone FROM structure WHERE id_structure = ?" ; try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query)) { @@ -45,7 +51,7 @@ public class StoreService { 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); @@ -60,22 +66,27 @@ 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(); } } + /** + * 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 { @@ -98,10 +109,15 @@ public class StoreService { } } - private List retrieveStoresFromDatabase() { + /** + * Retrieves stores from the database. + * + * @return a list of stores retrieved from the database + */ + private List retrieveStoresFromDatabase() { DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes - try (DatabaseConnectionDS databaseConnection = new DatabaseConnectionDS("com02", "B1Xto9pAbtBCOxuecG7W")) { + try (DatabaseConnectDOTSOFT databaseConnection = new DatabaseConnectDOTSOFT("com02")) { 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 " + @@ -111,10 +127,10 @@ public class StoreService { 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,8 +142,15 @@ public class StoreService { } } - private store mapResultSetTostore(ResultSet resultSet) throws SQLException { - store store = new store(); + /** + * 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")); @@ -137,43 +160,129 @@ public class StoreService { 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; - } - - 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; + @GET + @Path("/getStoreDetails") + @Produces(MediaType.APPLICATION_JSON) + public Response getStoreDetails() { + try { + StoreDetails storeDetails = retrieveStoreDetailsFromDatabase(); + + if (storeDetails != null) { + ObjectMapper objectMapper = new ObjectMapper(); + try { + String jsonResponse = objectMapper.writeValueAsString(storeDetails); + //System.out.println("JSON Response: " + jsonResponse); // Ajoutez ceci pour vérifier la sortie JSON + 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(); + } + } else { + return Response.status(Response.Status.NOT_FOUND).entity("{\"error\":\"Store details not found\"}").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. + * + * @return a list of stores retrieved from the database + */ + private StoreDetails retrieveStoreDetailsFromDatabase() { + DriverManager.setLoginTimeout(5); + StoreDetails storeDetails = new StoreDetails(); // Déclarer l'objet en dehors des blocs try + + try (DatabaseConnectDOTSOFT databaseConnection = new DatabaseConnectDOTSOFT("com02")) { + // Partie Store + String storeQuery = "SELECT st.id_structure, TRIM(st.nom) as nom, '10.100.0.18' AS ip, " + + "st.tel1 AS telephone, 'https://mp4.ikksgroup.com/photos/1/6/5/7/3/16573-large.JPG' as photoLink " + + "FROM COM02.STRUCTURE st " + + "WHERE st.id_structure = 4"; + + try (PreparedStatement storeStatement = databaseConnection.getConnection().prepareStatement(storeQuery); + ResultSet storeResultSet = storeStatement.executeQuery()) { + + if (storeResultSet.next()) { + Store store = mapResultSetToStore(storeResultSet); + storeDetails.setStore(store); // Définir la partie Store dans l'objet StoreDetails + // Faites quelque chose avec la partie Store + } else { + // Ajustez selon le comportement souhaité si aucun résultat n'est trouvé pour la partie Store + } + } + + // Partie Réplication + String replicationQuery = "SELECT 1 AS replicationOk, " + + "5 AS pendingReplications, " + + "TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS minReplicationDate, " + + "TO_CHAR(SYSDATE + INTERVAL '1' DAY, 'YYYY-MM-DD HH24:MI:SS') AS maxReplicationDate " + + "FROM DUAL"; + + try (PreparedStatement storeStatement = databaseConnection.getConnection().prepareStatement(replicationQuery); + ResultSet storeReplicationResultSet = storeStatement.executeQuery()) { + + if (storeReplicationResultSet.next()) { + StoreReplication storeReplication = mapResultSetToStoreReplication(storeReplicationResultSet); + storeDetails.setReplication(storeReplication); + } else { + // Ajustez selon le comportement souhaité si aucun résultat n'est trouvé pour la partie Store + } + } + + // Partie Ticket + String ticketQuery = "SELECT 10 AS totalTicketsInCaisse, " + + "15 AS totalTicketsInBackOffice " + + "FROM DUAL"; + + try (PreparedStatement ticketStatement = databaseConnection.getConnection().prepareStatement(ticketQuery); + ResultSet ticketResultSet = ticketStatement.executeQuery()) { + + if (ticketResultSet.next()) { + StoreTicket storeTicket = mapResultSetToStoreTicket(ticketResultSet); + storeDetails.setTickets(storeTicket); + } else { + // Ajustez selon le comportement souhaité si aucun résultat n'est trouvé pour la partie Ticket + } + } + } catch (SQLException e) { + e.printStackTrace(); + // Gérer les exceptions correctement dans un environnement de production + } + + // Retournez l'objet StoreDetails complet + return storeDetails; + } + + private Store mapResultSetToStore(ResultSet resultSet) throws SQLException { + Integer id_structure = resultSet.getInt("id_structure"); + String nom = resultSet.getString("nom"); + String ip = resultSet.getString("ip"); + String telephone = resultSet.getString("telephone"); + String photoLink = resultSet.getString("photoLink"); + + return new Store(id_structure, nom, ip, telephone, photoLink); + } + + private StoreReplication mapResultSetToStoreReplication(ResultSet resultSet) throws SQLException { + boolean replicationOk = resultSet.getBoolean("replicationOk"); + int pendingReplications = resultSet.getInt("pendingReplications"); + String minReplicationDate = resultSet.getString("minReplicationDate"); + String maxReplicationDate = resultSet.getString("maxReplicationDate"); + + return new StoreReplication(replicationOk, pendingReplications, minReplicationDate, maxReplicationDate); + } + + private StoreTicket mapResultSetToStoreTicket(ResultSet resultSet) throws SQLException { + int totalTicketsInCaisse = resultSet.getInt("totalTicketsInCaisse"); + int totalTicketsInBackOffice = resultSet.getInt("totalTicketsInBackOffice"); + + return new StoreTicket(totalTicketsInCaisse, totalTicketsInBackOffice); + } } 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..0024b8b --- /dev/null +++ b/src/main/java/com/example/services/store/Store.java @@ -0,0 +1,62 @@ +package com.example.services.store; + +public class Store { + private Integer id_structure; + private String nom; + private String ip; + private String telephone; + private String photoLink; + + + // Default constructor + public Store() {} + + // Constructor with parameters + public Store(Integer id_structure, String nom, String ip, String telephone, String photoLink) { + this.id_structure = id_structure; + this.nom = nom; + this.ip = ip; + this.telephone = telephone; + this.photoLink = photoLink; + } + + 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() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + 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; + } +} 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..e10c35c --- /dev/null +++ b/src/main/java/com/example/services/store/StoreDetails.java @@ -0,0 +1,44 @@ +package com.example.services.store; + +public class StoreDetails { + private Store store; + private StoreReplication replication; + private StoreTicket tickets; + + public StoreDetails() { + // Constructeur par défaut nécessaire pour la désérialisation JSON + } + + public StoreDetails(Store store, StoreReplication replication, StoreTicket tickets) { + this.store = store; + this.replication = replication; + this.tickets = tickets; + } + + public Store getStore() { + return store; + } + + public void setStore(Store store) { + this.store = store; + } + + public StoreReplication getReplication() { + return replication; + } + + public void setReplication(StoreReplication replication) { + this.replication = replication; + } + + public StoreTicket getTickets() { + return tickets; + } + + public void setTickets(StoreTicket tickets) { + this.tickets = tickets; + } + + // Ajoutez éventuellement d'autres méthodes ou personnalisez selon vos besoins +} + diff --git a/src/main/java/com/example/services/store/StoreReplication.java b/src/main/java/com/example/services/store/StoreReplication.java new file mode 100644 index 0000000..8805dd6 --- /dev/null +++ b/src/main/java/com/example/services/store/StoreReplication.java @@ -0,0 +1,55 @@ +package com.example.services.store; + +public class StoreReplication { + private boolean replicationOk; // Ajoutez les propriétés nécessaires pour la partie réplication + private int pendingReplications; + private String minReplicationDate; + private String maxReplicationDate; + + // Constructeur par défaut + public StoreReplication() { + // Default constructor required for JSON deserialization + } + + // Constructeur avec paramètres + public StoreReplication(boolean replicationOk, int pendingReplications, String minReplicationDate, String maxReplicationDate) { + this.replicationOk = replicationOk; + this.pendingReplications = pendingReplications; + this.minReplicationDate = minReplicationDate; + this.maxReplicationDate = maxReplicationDate; + } + + // Getters et setters + + public boolean isReplicationOk() { + return replicationOk; + } + + public void setReplicationOk(boolean replicationOk) { + this.replicationOk = replicationOk; + } + + public int getPendingReplications() { + return pendingReplications; + } + + public void setPendingReplications(int pendingReplications) { + this.pendingReplications = pendingReplications; + } + + public String getMinReplicationDate() { + return minReplicationDate; + } + + public void setMinReplicationDate(String minReplicationDate) { + this.minReplicationDate = minReplicationDate; + } + + public String getMaxReplicationDate() { + return maxReplicationDate; + } + + public void setMaxReplicationDate(String maxReplicationDate) { + this.maxReplicationDate = maxReplicationDate; + } +} diff --git a/src/main/java/com/example/services/store/StoreTicket.java b/src/main/java/com/example/services/store/StoreTicket.java new file mode 100644 index 0000000..cca2a23 --- /dev/null +++ b/src/main/java/com/example/services/store/StoreTicket.java @@ -0,0 +1,35 @@ +package com.example.services.store; + +public class StoreTicket { + private int cashRegisterTickets; // Ajoutez les propriétés nécessaires pour la partie tickets + private int backOfficeTickets; + + // Constructeur par défaut + public StoreTicket() { + // Default constructor required for JSON deserialization + } + + // Constructeur avec paramètres + public StoreTicket(int cashRegisterTickets, int backOfficeTickets) { + this.cashRegisterTickets = cashRegisterTickets; + this.backOfficeTickets = backOfficeTickets; + } + + // Getters et setters + + public int getCashRegisterTickets() { + return cashRegisterTickets; + } + + public void setCashRegisterTickets(int cashRegisterTickets) { + this.cashRegisterTickets = cashRegisterTickets; + } + + public int getBackOfficeTickets() { + return backOfficeTickets; + } + + public void setBackOfficeTickets(int backOfficeTickets) { + this.backOfficeTickets = backOfficeTickets; + } +} diff --git a/src/main/resources/db.properties b/src/main/resources/db.properties new file mode 100644 index 0000000..398f598 --- /dev/null +++ b/src/main/resources/db.properties @@ -0,0 +1,19 @@ +# 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:@prod-host:1521/PRODDB +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 \ 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..4f140de --- /dev/null +++ b/src/main/resources/env.properties @@ -0,0 +1,2 @@ +# Indicates the current environment (dev, preprod, prod, etc.). +environment=dev \ 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 From 356963964490c694cca6c12a7bae8e379c88dbc0 Mon Sep 17 00:00:00 2001 From: fbenoist68 Date: Sat, 18 Nov 2023 09:45:59 +0100 Subject: [PATCH 02/16] fix: add storeId variable to retrieveStoreDetails --- .../com/example/services/StoreService.java | 60 ++++++++++++------- 1 file changed, 38 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/example/services/StoreService.java b/src/main/java/com/example/services/StoreService.java index 9859515..a03f368 100644 --- a/src/main/java/com/example/services/StoreService.java +++ b/src/main/java/com/example/services/StoreService.java @@ -163,15 +163,25 @@ public class StoreService { @GET @Path("/getStoreDetails") @Produces(MediaType.APPLICATION_JSON) - public Response getStoreDetails() { + public Response getStoreDetails( + @QueryParam("dbHost") String dbHost, + @QueryParam("storeId") Integer storeId) { + + 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(); + } + try { - StoreDetails storeDetails = retrieveStoreDetailsFromDatabase(); + StoreDetails storeDetails = retrieveStoreDetails(dbHost,storeId); if (storeDetails != null) { ObjectMapper objectMapper = new ObjectMapper(); try { String jsonResponse = objectMapper.writeValueAsString(storeDetails); - //System.out.println("JSON Response: " + jsonResponse); // Ajoutez ceci pour vérifier la sortie JSON return Response.ok(jsonResponse).build(); } catch (JsonProcessingException e) { e.printStackTrace(); @@ -194,31 +204,37 @@ public class StoreService { * * @return a list of stores retrieved from the database */ - private StoreDetails retrieveStoreDetailsFromDatabase() { + private StoreDetails retrieveStoreDetails(String dbHost, Integer storeId) { DriverManager.setLoginTimeout(5); StoreDetails storeDetails = new StoreDetails(); // Déclarer l'objet en dehors des blocs try try (DatabaseConnectDOTSOFT databaseConnection = new DatabaseConnectDOTSOFT("com02")) { - // Partie Store + // Store section String storeQuery = "SELECT st.id_structure, TRIM(st.nom) as nom, '10.100.0.18' AS ip, " + "st.tel1 AS telephone, 'https://mp4.ikksgroup.com/photos/1/6/5/7/3/16573-large.JPG' as photoLink " + "FROM COM02.STRUCTURE st " + - "WHERE st.id_structure = 4"; + "WHERE st.id_structure = ?"; - try (PreparedStatement storeStatement = databaseConnection.getConnection().prepareStatement(storeQuery); - ResultSet storeResultSet = storeStatement.executeQuery()) { - - if (storeResultSet.next()) { - Store store = mapResultSetToStore(storeResultSet); - storeDetails.setStore(store); // Définir la partie Store dans l'objet StoreDetails - // Faites quelque chose avec la partie Store - } else { - // Ajustez selon le comportement souhaité si aucun résultat n'est trouvé pour la partie Store + try (PreparedStatement storeStatement = databaseConnection.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 for the Store part. + } } } - - // Partie Réplication + } catch (SQLException e) { + e.printStackTrace(); + // Handle exceptions correctly in a production environment + } + + try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost,"dtv")) { + // Replication section String replicationQuery = "SELECT 1 AS replicationOk, " + "5 AS pendingReplications, " + "TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS minReplicationDate, " + @@ -232,11 +248,11 @@ public class StoreService { StoreReplication storeReplication = mapResultSetToStoreReplication(storeReplicationResultSet); storeDetails.setReplication(storeReplication); } else { - // Ajustez selon le comportement souhaité si aucun résultat n'est trouvé pour la partie Store + // Adjust to the desired behavior if no results are found for the Replication section. } } - // Partie Ticket + // Ticket section String ticketQuery = "SELECT 10 AS totalTicketsInCaisse, " + "15 AS totalTicketsInBackOffice " + "FROM DUAL"; @@ -248,15 +264,15 @@ public class StoreService { StoreTicket storeTicket = mapResultSetToStoreTicket(ticketResultSet); storeDetails.setTickets(storeTicket); } else { - // Ajustez selon le comportement souhaité si aucun résultat n'est trouvé pour la partie Ticket + // Adjust to the desired behavior if no results are found for the Ticket section. } } } catch (SQLException e) { e.printStackTrace(); - // Gérer les exceptions correctement dans un environnement de production + // Handle exceptions correctly in a production environment } - // Retournez l'objet StoreDetails complet + // Return the complete StoreDetails object return storeDetails; } From 04c854af2f8aa069b4628f3254216d18400e59c3 Mon Sep 17 00:00:00 2001 From: fbenoist68 Date: Tue, 21 Nov 2023 00:35:09 +0100 Subject: [PATCH 03/16] feat : store details --- .../com/example/services/ItemService.java | 462 +++++++----------- .../com/example/services/StoreService.java | 88 ++-- .../java/com/example/services/item/Item.java | 294 +++++++++++ .../example/services/item/ItemDetails.java | 43 ++ .../com/example/services/item/ItemOption.java | 124 +++++ .../com/example/services/item/ItemPrices.java | 159 ++++++ .../services/store/BackOfficeTransaction.java | 85 ++++ .../com/example/services/store/Store.java | 4 +- .../example/services/store/StoreDetails.java | 16 +- .../services/store/StoreReplication.java | 56 ++- .../example/services/store/StoreTicket.java | 35 -- src/main/resources/db.properties | 2 +- src/main/resources/env.properties | 2 +- 13 files changed, 994 insertions(+), 376 deletions(-) create mode 100644 src/main/java/com/example/services/item/Item.java create mode 100644 src/main/java/com/example/services/item/ItemDetails.java create mode 100644 src/main/java/com/example/services/item/ItemOption.java create mode 100644 src/main/java/com/example/services/item/ItemPrices.java create mode 100644 src/main/java/com/example/services/store/BackOfficeTransaction.java delete mode 100644 src/main/java/com/example/services/store/StoreTicket.java diff --git a/src/main/java/com/example/services/ItemService.java b/src/main/java/com/example/services/ItemService.java index 5a69d6a..70d586a 100644 --- a/src/main/java/com/example/services/ItemService.java +++ b/src/main/java/com/example/services/ItemService.java @@ -1,5 +1,10 @@ package com.example.services; +import com.example.services.item.Item; +import com.example.services.item.ItemDetails; +import com.example.services.item.ItemOption; +import com.example.services.item.ItemPrices; + import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; @@ -14,12 +19,16 @@ 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") @@ -39,10 +48,10 @@ public class ItemService { DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost, "dtv")) { - String query = "SELECT * FROM ITM_ITEM WHERE ITEM_ID LIKE ?" ; + 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()) { @@ -99,287 +108,190 @@ 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; - - // Getters and Setters for all fields - - public Long getOrganizationId() { - return organizationId; + @GET + @Path("/getItemDetails") + @Produces(MediaType.APPLICATION_JSON) + public Response getItemDetails( + @QueryParam("dbHost") String dbHost, + @QueryParam("itemId") String itemId) { + + 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(); } - public void setOrganizationId(Long organizationId) { - this.organizationId = organizationId; - } + try { + ItemDetails itemDetails = retrieveItemDetails(dbHost,itemId); - 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; + if (itemDetails != null) { + ObjectMapper objectMapper = new ObjectMapper(); + try { + String jsonResponse = objectMapper.writeValueAsString(itemDetails); + return Response.ok(jsonResponse).build(); + } catch (JsonProcessingException e) { + e.printStackTrace(); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity("{\"error\":\"Error converting ItemDetails to JSON\"}") + .build(); + } + } else { + return Response.status(Response.Status.NOT_FOUND).entity("{\"error\":\"Item details not found\"}").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 itemDetails from the database. + * + * @return a list of items retrieved from the database + */ + private ItemDetails retrieveItemDetails(String dbHost, String itemId) { + DriverManager.setLoginTimeout(5); + + ItemDetails itemDetails = new ItemDetails(); // Declare object outside try blocks + + List itemList = new ArrayList<>(); + List itemOptionList = new ArrayList<>(); + List itemPricesList = new ArrayList<>(); + + try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost,"dtv")) { + // Item section + String itemQuery = "SELECT item_id,item_lvlcode,parent_item_id,item_typcode,create_date,create_user_id,update_date,update_user_id " + + "FROM dtv.itm_item " + + "WHERE organization_id = 1 AND item_id LIKE ?"; + + logger.info(itemQuery); + try (PreparedStatement itemStatement = databaseConnection.getConnection().prepareStatement(itemQuery)) { + // Concatenate % to parameter itemId + itemStatement.setString(1, itemId + "%"); + + try (ResultSet itemResultSet = itemStatement.executeQuery()) { + while (itemResultSet.next()) { + Item item = mapResultSetToItemDetails(itemResultSet); + itemList.add(item); + } + + itemDetails.setItems(itemList); + } + + } + + // item option section + String itemOptionQuery = "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 ?"; + + logger.info(itemOptionQuery); + try (PreparedStatement itemOptionStatement = databaseConnection.getConnection().prepareStatement(itemOptionQuery)) { + // Concatenate % to parameter itemId + itemOptionStatement.setString(1, itemId + "%"); + + try (ResultSet itemOptionResultSet = itemOptionStatement.executeQuery()) { + while (itemOptionResultSet.next()) { + ItemOption itemOption = mapResultSetToItemOptionDetails(itemOptionResultSet); + itemOptionList.add(itemOption); + } + + itemDetails.setItemOptions(itemOptionList); + } + } + + // item option price + String itemPricesQuery = "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 ?"; + + logger.info(itemPricesQuery); + try (PreparedStatement itemPricesStatement = databaseConnection.getConnection().prepareStatement(itemPricesQuery)) { + // Concatenate % to parameter itemId + itemPricesStatement.setString(1, itemId + "%"); + + try (ResultSet itemPricesResultSet = itemPricesStatement.executeQuery()) { + while (itemPricesResultSet.next()) { + ItemPrices itemPrices = mapResultSetToItemPricesDetails(itemPricesResultSet); + itemPricesList.add(itemPrices); + } + + itemDetails.setItemPrices(itemPricesList); + } + } + } catch (SQLException e) { + e.printStackTrace(); + // Handle exceptions correctly in a production environment + } + + // Return the complete ItemDetails object + return itemDetails; + } + + private Item mapResultSetToItemDetails(ResultSet resultSet) throws SQLException { + Item item = new Item(); + + item.setItemId(resultSet.getString("ITEM_ID")); + item.setItemLevelCode(resultSet.getString("ITEM_LVLCODE")); + item.setParentItemId(resultSet.getString("PARENT_ITEM_ID")); + item.setItemTypeCode(resultSet.getString("ITEM_TYPCODE")); + item.setCreateDate(resultSet.getDate("CREATE_DATE")); + item.setCreateUserId(resultSet.getString("CREATE_USER_ID")); + item.setUpdateDate(resultSet.getDate("UPDATE_DATE")); + item.setUpdateUserId(resultSet.getString("UPDATE_USER_ID")); + + return item; + } + + private ItemOption mapResultSetToItemOptionDetails(ResultSet resultSet) throws SQLException { + ItemOption itemOption = new ItemOption(); + + 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")); + + return itemOption; + } + + private ItemPrices mapResultSetToItemPricesDetails(ResultSet resultSet) throws SQLException { + + ItemPrices itemPrices = new ItemPrices(); + + 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; + } +} \ 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 a03f368..2ad33eb 100644 --- a/src/main/java/com/example/services/StoreService.java +++ b/src/main/java/com/example/services/StoreService.java @@ -12,6 +12,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; @@ -22,8 +23,13 @@ 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 final Logger logger = LoggerFactory.getLogger(DatabaseConnectDOTSOFT.class); + private static List cachedStoreList; private static final Lock cacheLock = new ReentrantLock(); @@ -118,11 +124,13 @@ public class StoreService { DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes try (DatabaseConnectDOTSOFT databaseConnection = new DatabaseConnectDOTSOFT("com02")) { - String query = "SELECT st.id_structure, TRIM(st.nom) as nom, '10.100.0.18' AS ip, " + + String query = "SELECT st.id_structure, TRIM(st.nom) as nom, hsc.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"; + "JOIN COM02.hotline_structure_caisse hsc ON hsc.id_structure = st.id_structure AND hsc.id_caisse = 1 " + + "WHERE st.id_structure < 50 AND hsc.ip IS NOT NULL AND st.ID_NIVEAU=4 AND st.STATUT=2 " + + "ORDER BY st.id_structure"; try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query); ResultSet resultSet = statement.executeQuery()) { @@ -215,7 +223,8 @@ public class StoreService { "st.tel1 AS telephone, 'https://mp4.ikksgroup.com/photos/1/6/5/7/3/16573-large.JPG' as photoLink " + "FROM COM02.STRUCTURE st " + "WHERE st.id_structure = ?"; - + + logger.info(storeQuery); try (PreparedStatement storeStatement = databaseConnection.getConnection().prepareStatement(storeQuery)) { storeStatement.setInt(1, storeId); // Set the value of the parameter @@ -228,6 +237,31 @@ public class StoreService { } } } + + // Transaction section + String transactionQuery = "SELECT COUNT(*) as backOfficeTransactions, " + + " MIN(cf.fdate_integration) AS minBackOfficeTransactionDate, " + + " MAX(cf.fdate_integration) AS maxBackOfficeTransactionDate, " + + " TRUNC(MAX(cf.fdate)) AS backOfficeBusinessDate, " + + " CASE WHEN TRUNC(MAX(cf.fdate)) = TRUNC(SYSDATE )THEN 1 ELSE 0 END AS backOfficeTransactionOk "+ + "FROM com02.client_facture cf " + + "WHERE cf.id_structure = ? " + + "AND TRUNC(cf.fdate_integration) = TRUNC(SYSDATE-2) " + //TODO : changer la date + "AND cf.version_info = 'XSTORE'"; + + logger.info(transactionQuery); + try (PreparedStatement transactionStatement = databaseConnection.getConnection().prepareStatement(transactionQuery)) { + transactionStatement.setInt(1, storeId); // Set the value of the parameter + + try (ResultSet transactionResultSet = transactionStatement.executeQuery()) { + if (transactionResultSet.next()) { + BackOfficeTransaction storetransaction = mapResultSetToBackOfficetransaction(transactionResultSet); + storeDetails.setTransaction(storetransaction); + } else { + // Adjust to the desired behavior if no results are found for the transaction section. + } + } + } } catch (SQLException e) { e.printStackTrace(); // Handle exceptions correctly in a production environment @@ -235,12 +269,13 @@ public class StoreService { try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost,"dtv")) { // Replication section - String replicationQuery = "SELECT 1 AS replicationOk, " + - "5 AS pendingReplications, " + - "TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS minReplicationDate, " + - "TO_CHAR(SYSDATE + INTERVAL '1' DAY, 'YYYY-MM-DD HH24:MI:SS') AS maxReplicationDate " + - "FROM DUAL"; + String replicationQuery = "SELECT COUNT(*) AS pendingReplications, " + + "MIN(crq.CREATE_DATE) AS minPendingReplicationDate, " + + "MAX(crq.CREATE_DATE) AS maxPendingReplicationDate, " + + "CASE WHEN MIN(crq.CREATE_DATE) IS NULL OR MIN(crq.CREATE_DATE) > SYSDATE - INTERVAL '5' MINUTE THEN 1 ELSE 0 END AS pendingReplicationOk "+ + "FROM repqueue.CTL_REPLICATION_QUEUE crq"; + logger.info(replicationQuery); try (PreparedStatement storeStatement = databaseConnection.getConnection().prepareStatement(replicationQuery); ResultSet storeReplicationResultSet = storeStatement.executeQuery()) { @@ -251,22 +286,6 @@ public class StoreService { // Adjust to the desired behavior if no results are found for the Replication section. } } - - // Ticket section - String ticketQuery = "SELECT 10 AS totalTicketsInCaisse, " + - "15 AS totalTicketsInBackOffice " + - "FROM DUAL"; - - try (PreparedStatement ticketStatement = databaseConnection.getConnection().prepareStatement(ticketQuery); - ResultSet ticketResultSet = ticketStatement.executeQuery()) { - - if (ticketResultSet.next()) { - StoreTicket storeTicket = mapResultSetToStoreTicket(ticketResultSet); - storeDetails.setTickets(storeTicket); - } else { - // Adjust to the desired behavior if no results are found for the Ticket section. - } - } } catch (SQLException e) { e.printStackTrace(); // Handle exceptions correctly in a production environment @@ -287,18 +306,21 @@ public class StoreService { } private StoreReplication mapResultSetToStoreReplication(ResultSet resultSet) throws SQLException { - boolean replicationOk = resultSet.getBoolean("replicationOk"); + boolean pendingReplicationOk = resultSet.getBoolean("pendingReplicationOk"); int pendingReplications = resultSet.getInt("pendingReplications"); - String minReplicationDate = resultSet.getString("minReplicationDate"); - String maxReplicationDate = resultSet.getString("maxReplicationDate"); + Date minPendingReplicationDate = resultSet.getDate("minPendingReplicationDate"); + Date maxPendingReplicationDate = resultSet.getDate("maxPendingReplicationDate"); - return new StoreReplication(replicationOk, pendingReplications, minReplicationDate, maxReplicationDate); + return new StoreReplication(pendingReplicationOk, pendingReplications, minPendingReplicationDate, maxPendingReplicationDate); } - private StoreTicket mapResultSetToStoreTicket(ResultSet resultSet) throws SQLException { - int totalTicketsInCaisse = resultSet.getInt("totalTicketsInCaisse"); - int totalTicketsInBackOffice = resultSet.getInt("totalTicketsInBackOffice"); - - return new StoreTicket(totalTicketsInCaisse, totalTicketsInBackOffice); + private BackOfficeTransaction mapResultSetToBackOfficetransaction(ResultSet resultSet) throws SQLException { + boolean backOfficeTransactionOk = resultSet.getBoolean("backOfficeTransactionOk"); + int backofficeTransactions = resultSet.getInt("backOfficeTransactions"); + Date minBackofficeTransactionDate = resultSet.getDate("minBackOfficeTransactionDate"); + Date maxBackofficeTransactionDate = resultSet.getDate("maxBackOfficeTransactionDate"); + Date backOfficeBusinessDate = resultSet.getDate("backOfficeBusinessDate"); + + return new BackOfficeTransaction(backOfficeTransactionOk, backofficeTransactions, minBackofficeTransactionDate, maxBackofficeTransactionDate, backOfficeBusinessDate); } } 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..f916787 --- /dev/null +++ b/src/main/java/com/example/services/item/Item.java @@ -0,0 +1,294 @@ +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; + private String recordState; + + // 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() { + 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/item/ItemDetails.java b/src/main/java/com/example/services/item/ItemDetails.java new file mode 100644 index 0000000..abcbb62 --- /dev/null +++ b/src/main/java/com/example/services/item/ItemDetails.java @@ -0,0 +1,43 @@ +package com.example.services.item; + +import java.util.List; + +public class ItemDetails { + private List items; + private List itemOptions; + private List itemPrices; + + public ItemDetails() { + // Default constructor required for JSON deserialization + } + + public ItemDetails(List items, List itemOptions, List itemPrices) { + this.items = items; + this.itemOptions = itemOptions; + this.itemPrices = itemPrices; + } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } + + public List getItemOptions() { + return itemOptions; + } + + public void setItemOptions(List itemOptions) { + this.itemOptions = itemOptions; + } + + public List getItemPrices() { + return itemPrices; + } + + public void setItemPrices(List itemPrices) { + this.itemPrices = itemPrices; + } +} 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..9585a6e --- /dev/null +++ b/src/main/java/com/example/services/item/ItemOption.java @@ -0,0 +1,124 @@ +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() { + 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; + } +} + diff --git a/src/main/java/com/example/services/item/ItemPrices.java b/src/main/java/com/example/services/item/ItemPrices.java new file mode 100644 index 0000000..a2f6917 --- /dev/null +++ b/src/main/java/com/example/services/item/ItemPrices.java @@ -0,0 +1,159 @@ +package com.example.services.item; + +import java.sql.Date; +import java.text.SimpleDateFormat; + +public class ItemPrices { + 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 ItemPrices() { + // 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() { + 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/BackOfficeTransaction.java b/src/main/java/com/example/services/store/BackOfficeTransaction.java new file mode 100644 index 0000000..fb88302 --- /dev/null +++ b/src/main/java/com/example/services/store/BackOfficeTransaction.java @@ -0,0 +1,85 @@ +package com.example.services.store; + +import java.sql.Date; +import java.text.SimpleDateFormat; + +public class BackOfficeTransaction { + private boolean backOfficeTransactionOk; + private int backOfficeTransactions; + private Date minBackOfficeTransactionDate; + private Date maxBackOfficeTransactionDate; + private Date backOfficeBusinessDate; + + + // Constructeur par défaut + public BackOfficeTransaction() { + // Default constructor required for JSON deserialization + } + + // Constructeur avec paramètres + public BackOfficeTransaction(boolean backOfficeTransactionOk, int backOfficeTransactions, Date minbackOfficeTransactionDate, Date maxbackOfficeTransactionDate, Date backOfficeBusinessDate) { + this.backOfficeTransactionOk = backOfficeTransactionOk; + this.backOfficeTransactions = backOfficeTransactions; + this.minBackOfficeTransactionDate = minbackOfficeTransactionDate; + this.maxBackOfficeTransactionDate = maxbackOfficeTransactionDate; + this.backOfficeBusinessDate = backOfficeBusinessDate; + } + + // Getters et setters + + public boolean isBackOfficeTransactionOk() { + return backOfficeTransactionOk; + } + + public void setBackOfficeTransactionOk(boolean backOfficeTransactionOk) { + this.backOfficeTransactionOk = backOfficeTransactionOk; + } + + 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; + } + + public String getBackOfficeBusinessDate() { + if (backOfficeBusinessDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); + return dateFormat.format(backOfficeBusinessDate); + } else { + return ""; + } + } + + + public void setBackOfficeBusinessDate(Date backOfficeBusinessDate) { + this.backOfficeBusinessDate = backOfficeBusinessDate; + } +} diff --git a/src/main/java/com/example/services/store/Store.java b/src/main/java/com/example/services/store/Store.java index 0024b8b..b4e3104 100644 --- a/src/main/java/com/example/services/store/Store.java +++ b/src/main/java/com/example/services/store/Store.java @@ -9,7 +9,9 @@ public class Store { // Default constructor - public Store() {} + public Store() { + // Default constructor required for JSON deserialization + } // Constructor with parameters public Store(Integer id_structure, String nom, String ip, String telephone, String photoLink) { diff --git a/src/main/java/com/example/services/store/StoreDetails.java b/src/main/java/com/example/services/store/StoreDetails.java index e10c35c..2b66db3 100644 --- a/src/main/java/com/example/services/store/StoreDetails.java +++ b/src/main/java/com/example/services/store/StoreDetails.java @@ -3,16 +3,16 @@ package com.example.services.store; public class StoreDetails { private Store store; private StoreReplication replication; - private StoreTicket tickets; + private BackOfficeTransaction transaction; public StoreDetails() { // Constructeur par défaut nécessaire pour la désérialisation JSON } - public StoreDetails(Store store, StoreReplication replication, StoreTicket tickets) { + public StoreDetails(Store store, StoreReplication replication, BackOfficeTransaction transaction) { this.store = store; this.replication = replication; - this.tickets = tickets; + this.transaction = transaction; } public Store getStore() { @@ -31,14 +31,12 @@ public class StoreDetails { this.replication = replication; } - public StoreTicket getTickets() { - return tickets; + public BackOfficeTransaction getTransaction() { + return transaction; } - public void setTickets(StoreTicket tickets) { - this.tickets = tickets; + public void setTransaction(BackOfficeTransaction transaction) { + this.transaction = transaction; } - - // Ajoutez éventuellement d'autres méthodes ou personnalisez selon vos besoins } diff --git a/src/main/java/com/example/services/store/StoreReplication.java b/src/main/java/com/example/services/store/StoreReplication.java index 8805dd6..4b588b2 100644 --- a/src/main/java/com/example/services/store/StoreReplication.java +++ b/src/main/java/com/example/services/store/StoreReplication.java @@ -1,10 +1,13 @@ package com.example.services.store; +import java.sql.Date; +import java.text.SimpleDateFormat; + public class StoreReplication { - private boolean replicationOk; // Ajoutez les propriétés nécessaires pour la partie réplication + private boolean pendingReplicationOk; private int pendingReplications; - private String minReplicationDate; - private String maxReplicationDate; + private Date minPendingReplicationDate; + private Date maxPendingReplicationDate; // Constructeur par défaut public StoreReplication() { @@ -12,21 +15,21 @@ public class StoreReplication { } // Constructeur avec paramètres - public StoreReplication(boolean replicationOk, int pendingReplications, String minReplicationDate, String maxReplicationDate) { - this.replicationOk = replicationOk; + public StoreReplication(boolean pendingReplicationOk, int pendingReplications, Date minPendingReplicationDate, Date maxPendingReplicationDate) { + this.pendingReplicationOk = pendingReplicationOk; this.pendingReplications = pendingReplications; - this.minReplicationDate = minReplicationDate; - this.maxReplicationDate = maxReplicationDate; + this.minPendingReplicationDate = maxPendingReplicationDate; + this.maxPendingReplicationDate = maxPendingReplicationDate; } // Getters et setters - public boolean isReplicationOk() { - return replicationOk; + public boolean isPendingReplicationOk() { + return pendingReplicationOk; } - public void setReplicationOk(boolean replicationOk) { - this.replicationOk = replicationOk; + public void setPendingReplicationOk(boolean replicationOk) { + this.pendingReplicationOk = replicationOk; } public int getPendingReplications() { @@ -37,19 +40,30 @@ public class StoreReplication { this.pendingReplications = pendingReplications; } - public String getMinReplicationDate() { - return minReplicationDate; + 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 void setMinReplicationDate(String minReplicationDate) { - this.minReplicationDate = minReplicationDate; + public String getMaxPendingReplicationDate() { + if (maxPendingReplicationDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(maxPendingReplicationDate); + } else { + return ""; + } } + - public String getMaxReplicationDate() { - return maxReplicationDate; - } - - public void setMaxReplicationDate(String maxReplicationDate) { - this.maxReplicationDate = maxReplicationDate; + public void setMaxReplicationDate(Date maxPendingReplicationDate) { + this.maxPendingReplicationDate = maxPendingReplicationDate; } } diff --git a/src/main/java/com/example/services/store/StoreTicket.java b/src/main/java/com/example/services/store/StoreTicket.java deleted file mode 100644 index cca2a23..0000000 --- a/src/main/java/com/example/services/store/StoreTicket.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.example.services.store; - -public class StoreTicket { - private int cashRegisterTickets; // Ajoutez les propriétés nécessaires pour la partie tickets - private int backOfficeTickets; - - // Constructeur par défaut - public StoreTicket() { - // Default constructor required for JSON deserialization - } - - // Constructeur avec paramètres - public StoreTicket(int cashRegisterTickets, int backOfficeTickets) { - this.cashRegisterTickets = cashRegisterTickets; - this.backOfficeTickets = backOfficeTickets; - } - - // Getters et setters - - public int getCashRegisterTickets() { - return cashRegisterTickets; - } - - public void setCashRegisterTickets(int cashRegisterTickets) { - this.cashRegisterTickets = cashRegisterTickets; - } - - public int getBackOfficeTickets() { - return backOfficeTickets; - } - - public void setBackOfficeTickets(int backOfficeTickets) { - this.backOfficeTickets = backOfficeTickets; - } -} diff --git a/src/main/resources/db.properties b/src/main/resources/db.properties index 398f598..34ea8ca 100644 --- a/src/main/resources/db.properties +++ b/src/main/resources/db.properties @@ -9,7 +9,7 @@ preprod.db.oai.password=base preprod.db.com02.password=B1Xto9pAbtBCOxuecG7W # Production environment settings (prod) -prod.db.url=jdbc:oracle:thin:@prod-host:1521/PRODDB +prod.db.url=jdbc:oracle:thin:@paspdi-mgmt.adic.lan.adic.lan:1521/IASPDI prod.db.oai.password=base prod.db.com02.password=com20 diff --git a/src/main/resources/env.properties b/src/main/resources/env.properties index 4f140de..40b8a7c 100644 --- a/src/main/resources/env.properties +++ b/src/main/resources/env.properties @@ -1,2 +1,2 @@ # Indicates the current environment (dev, preprod, prod, etc.). -environment=dev \ No newline at end of file +environment=preprod \ No newline at end of file From 3c1ccc4a2c9ff56e66eeddb6ea765c87f8d57d46 Mon Sep 17 00:00:00 2001 From: fbenoist68 Date: Tue, 21 Nov 2023 22:51:20 +0100 Subject: [PATCH 04/16] feat: small modifications --- .../com/example/services/ItemService.java | 42 +++++- .../java/com/example/services/item/Item.java | 17 +-- .../example/services/item/ItemDetails.java | 12 +- .../com/example/services/item/ItemOption.java | 6 + .../com/example/services/item/ItemPrices.java | 6 + .../com/example/services/item/ItemStock.java | 122 ++++++++++++++++++ 6 files changed, 193 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/example/services/item/ItemStock.java diff --git a/src/main/java/com/example/services/ItemService.java b/src/main/java/com/example/services/ItemService.java index 70d586a..43a76e3 100644 --- a/src/main/java/com/example/services/ItemService.java +++ b/src/main/java/com/example/services/ItemService.java @@ -4,6 +4,7 @@ import com.example.services.item.Item; import com.example.services.item.ItemDetails; import com.example.services.item.ItemOption; import com.example.services.item.ItemPrices; +import com.example.services.item.ItemStock; import javax.ws.rs.GET; import javax.ws.rs.Path; @@ -112,7 +113,6 @@ public class ItemService { item.setCreateUserId(resultSet.getString("CREATE_USER_ID")); item.setUpdateDate(resultSet.getDate("UPDATE_DATE")); item.setUpdateUserId(resultSet.getString("UPDATE_USER_ID")); - item.setRecordState(resultSet.getString("RECORD_STATE")); return item; } @@ -169,6 +169,7 @@ public class ItemService { List itemList = new ArrayList<>(); List itemOptionList = new ArrayList<>(); List itemPricesList = new ArrayList<>(); + List itemStockList = new ArrayList<>(); try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost,"dtv")) { // Item section @@ -231,6 +232,26 @@ public class ItemService { itemDetails.setItemPrices(itemPricesList); } } + + // item stock section + String ItemStockQuery = "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 ?"; + + logger.info(ItemStockQuery); + try (PreparedStatement itemStockStatement = databaseConnection.getConnection().prepareStatement(ItemStockQuery)) { + // Concatenate % to parameter itemId + itemStockStatement.setString(1, itemId + "%"); + + try (ResultSet itemStockResultSet = itemStockStatement.executeQuery()) { + while (itemStockResultSet.next()) { + ItemStock itemStock = mapResultSetToItemStockDetails(itemStockResultSet); + itemStockList.add(itemStock); + } + + itemDetails.setItemStock(itemStockList); + } + } } catch (SQLException e) { e.printStackTrace(); // Handle exceptions correctly in a production environment @@ -294,4 +315,23 @@ public class ItemService { 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/item/Item.java b/src/main/java/com/example/services/item/Item.java index f916787..aa41f64 100644 --- a/src/main/java/com/example/services/item/Item.java +++ b/src/main/java/com/example/services/item/Item.java @@ -33,7 +33,6 @@ import java.text.SimpleDateFormat; private String createUserId; private Date updateDate; private String updateUserId; - private String recordState; // Constructeur par défaut public Item() { @@ -251,11 +250,14 @@ import java.text.SimpleDateFormat; } } - public void setCreateDate(Date createDate) { + public void setCreateDate(Date createDate) { this.createDate = createDate; } public String getCreateUserId() { + if (createUserId == null) { + return ""; + } return createUserId; } @@ -277,18 +279,13 @@ import java.text.SimpleDateFormat; } public String getUpdateUserId() { + if (updateUserId == null) { + return ""; + } 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/item/ItemDetails.java b/src/main/java/com/example/services/item/ItemDetails.java index abcbb62..134a137 100644 --- a/src/main/java/com/example/services/item/ItemDetails.java +++ b/src/main/java/com/example/services/item/ItemDetails.java @@ -6,15 +6,17 @@ public class ItemDetails { private List items; private List itemOptions; private List itemPrices; + private List itemStock; public ItemDetails() { // Default constructor required for JSON deserialization } - public ItemDetails(List items, List itemOptions, List itemPrices) { + public ItemDetails(List items, List itemOptions, List itemPrices, List itemStocks) { this.items = items; this.itemOptions = itemOptions; this.itemPrices = itemPrices; + this.itemStock = itemStocks; } public List getItems() { @@ -40,4 +42,12 @@ public class ItemDetails { public void setItemPrices(List itemPrices) { this.itemPrices = itemPrices; } + + public List getItemStock() { + return itemStock; + } + + public void setItemStock(List itemStocks) { + this.itemStock = itemStocks; + } } diff --git a/src/main/java/com/example/services/item/ItemOption.java b/src/main/java/com/example/services/item/ItemOption.java index 9585a6e..41a172b 100644 --- a/src/main/java/com/example/services/item/ItemOption.java +++ b/src/main/java/com/example/services/item/ItemOption.java @@ -93,6 +93,9 @@ public class ItemOption { } public String getCreateUserId() { + if (createUserId == null) { + return ""; + } return createUserId; } @@ -114,6 +117,9 @@ public class ItemOption { } public String getUpdateUserId() { + if (updateUserId == null) { + return ""; + } return updateUserId; } diff --git a/src/main/java/com/example/services/item/ItemPrices.java b/src/main/java/com/example/services/item/ItemPrices.java index a2f6917..5086986 100644 --- a/src/main/java/com/example/services/item/ItemPrices.java +++ b/src/main/java/com/example/services/item/ItemPrices.java @@ -129,6 +129,9 @@ public class ItemPrices { } public String getCreateUserId() { + if (createUserId == null) { + return ""; + } return createUserId; } @@ -150,6 +153,9 @@ public class ItemPrices { } public String getUpdateUserId() { + if (updateUserId == null) { + return ""; + } return updateUserId; } 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 From 05e5b334f7986b33e39c53ea03d2b1951bcfe609 Mon Sep 17 00:00:00 2001 From: fbenoist68 Date: Wed, 22 Nov 2023 00:37:47 +0100 Subject: [PATCH 05/16] fix: error min transaction and env = PROD --- src/main/java/com/example/services/StoreService.java | 4 ++-- .../java/com/example/services/store/StoreReplication.java | 2 +- src/main/resources/db.properties | 2 +- src/main/resources/env.properties | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/services/StoreService.java b/src/main/java/com/example/services/StoreService.java index 2ad33eb..fa12d4e 100644 --- a/src/main/java/com/example/services/StoreService.java +++ b/src/main/java/com/example/services/StoreService.java @@ -129,7 +129,7 @@ public class StoreService { "FROM COM02.STRUCTURE st " + "LEFT OUTER JOIN omni.ASPD_XSTO_STRUCTURE axs ON st.ID_STRUCTURE = axs.ID_STRUCTURE " + "JOIN COM02.hotline_structure_caisse hsc ON hsc.id_structure = st.id_structure AND hsc.id_caisse = 1 " + - "WHERE st.id_structure < 50 AND hsc.ip IS NOT NULL AND st.ID_NIVEAU=4 AND st.STATUT=2 " + + "WHERE st.id_structure < 9999 AND hsc.ip IS NOT NULL AND st.ID_NIVEAU=4 AND st.STATUT=2 " + "ORDER BY st.id_structure"; try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query); @@ -246,7 +246,7 @@ public class StoreService { " CASE WHEN TRUNC(MAX(cf.fdate)) = TRUNC(SYSDATE )THEN 1 ELSE 0 END AS backOfficeTransactionOk "+ "FROM com02.client_facture cf " + "WHERE cf.id_structure = ? " + - "AND TRUNC(cf.fdate_integration) = TRUNC(SYSDATE-2) " + //TODO : changer la date + "AND TRUNC(cf.fdate_integration) = TRUNC(SYSDATE) " + //TODO : changer la date "AND cf.version_info = 'XSTORE'"; logger.info(transactionQuery); diff --git a/src/main/java/com/example/services/store/StoreReplication.java b/src/main/java/com/example/services/store/StoreReplication.java index 4b588b2..3491ae2 100644 --- a/src/main/java/com/example/services/store/StoreReplication.java +++ b/src/main/java/com/example/services/store/StoreReplication.java @@ -18,7 +18,7 @@ public class StoreReplication { public StoreReplication(boolean pendingReplicationOk, int pendingReplications, Date minPendingReplicationDate, Date maxPendingReplicationDate) { this.pendingReplicationOk = pendingReplicationOk; this.pendingReplications = pendingReplications; - this.minPendingReplicationDate = maxPendingReplicationDate; + this.minPendingReplicationDate = minPendingReplicationDate; this.maxPendingReplicationDate = maxPendingReplicationDate; } diff --git a/src/main/resources/db.properties b/src/main/resources/db.properties index 34ea8ca..1c8d3b9 100644 --- a/src/main/resources/db.properties +++ b/src/main/resources/db.properties @@ -9,7 +9,7 @@ preprod.db.oai.password=base preprod.db.com02.password=B1Xto9pAbtBCOxuecG7W # Production environment settings (prod) -prod.db.url=jdbc:oracle:thin:@paspdi-mgmt.adic.lan.adic.lan:1521/IASPDI +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 diff --git a/src/main/resources/env.properties b/src/main/resources/env.properties index 40b8a7c..e30e658 100644 --- a/src/main/resources/env.properties +++ b/src/main/resources/env.properties @@ -1,2 +1,2 @@ # Indicates the current environment (dev, preprod, prod, etc.). -environment=preprod \ No newline at end of file +environment=prod \ No newline at end of file From 99d6e8d5e00d9ffb0016e8126d7f8dfa955b7f03 Mon Sep 17 00:00:00 2001 From: fbenoist68 Date: Sun, 26 Nov 2023 23:17:30 +0100 Subject: [PATCH 06/16] feat: store_retail --- .../services/DatabaseConnectDOTSOFT.java | 21 +- .../services/DatabaseConnectXSTORE.java | 23 +- .../com/example/services/ItemService.java | 350 +++++++++--------- .../com/example/services/StoreService.java | 269 ++++++++++++-- .../example/services/item/ItemDetails.java | 53 --- .../item/{ItemPrices.java => ItemPrice.java} | 4 +- .../services/store/BackOfficeTransaction.java | 4 +- .../com/example/services/store/Store.java | 12 +- .../example/services/store/StoreDetails.java | 2 +- .../example/services/store/StoreSequence.java | 137 +++++++ .../services/store/StoreSignature.java | 155 ++++++++ .../example/services/store/StoreVersion.java | 147 ++++++++ 12 files changed, 886 insertions(+), 291 deletions(-) delete mode 100644 src/main/java/com/example/services/item/ItemDetails.java rename src/main/java/com/example/services/item/{ItemPrices.java => ItemPrice.java} (98%) create mode 100644 src/main/java/com/example/services/store/StoreSequence.java create mode 100644 src/main/java/com/example/services/store/StoreSignature.java create mode 100644 src/main/java/com/example/services/store/StoreVersion.java diff --git a/src/main/java/com/example/services/DatabaseConnectDOTSOFT.java b/src/main/java/com/example/services/DatabaseConnectDOTSOFT.java index 5e5f2b4..a159155 100644 --- a/src/main/java/com/example/services/DatabaseConnectDOTSOFT.java +++ b/src/main/java/com/example/services/DatabaseConnectDOTSOFT.java @@ -15,16 +15,21 @@ public class DatabaseConnectDOTSOFT implements AutoCloseable { private Connection connection; - public DatabaseConnectDOTSOFT(String username) throws SQLException { + public DatabaseConnectDOTSOFT(String username) { String environment = loadEnvironment(); - 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); + 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); + } } public Connection getConnection() { diff --git a/src/main/java/com/example/services/DatabaseConnectXSTORE.java b/src/main/java/com/example/services/DatabaseConnectXSTORE.java index 7258fb9..9576cc4 100644 --- a/src/main/java/com/example/services/DatabaseConnectXSTORE.java +++ b/src/main/java/com/example/services/DatabaseConnectXSTORE.java @@ -15,16 +15,19 @@ public class DatabaseConnectXSTORE implements AutoCloseable { private Connection connection; - public DatabaseConnectXSTORE(String dbHost, String username) throws SQLException { - Properties dbProperties = loadDatabaseProperties(); - - String url = dbProperties.getProperty("xstore.db.url").replace("HOST", dbHost); - String userpassword = dbProperties.getProperty("xstore.db." + username + ".password"); - - // Initialiser votre connexion à la base de données ici - connection = DriverManager.getConnection(url, username, userpassword); - - logger.info("XSTORE Connection OK for user " + username + " on host " + dbHost); + public DatabaseConnectXSTORE(String dbHost, String username) { + 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); + } } public Connection getConnection() { diff --git a/src/main/java/com/example/services/ItemService.java b/src/main/java/com/example/services/ItemService.java index 43a76e3..958184d 100644 --- a/src/main/java/com/example/services/ItemService.java +++ b/src/main/java/com/example/services/ItemService.java @@ -1,13 +1,13 @@ package com.example.services; import com.example.services.item.Item; -import com.example.services.item.ItemDetails; import com.example.services.item.ItemOption; -import com.example.services.item.ItemPrices; +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; @@ -32,20 +32,22 @@ 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 (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost, "dtv")) { @@ -63,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) { @@ -117,165 +272,6 @@ public class ItemService { return item; } - @GET - @Path("/getItemDetails") - @Produces(MediaType.APPLICATION_JSON) - public Response getItemDetails( - @QueryParam("dbHost") String dbHost, - @QueryParam("itemId") String itemId) { - - 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(); - } - - try { - ItemDetails itemDetails = retrieveItemDetails(dbHost,itemId); - - if (itemDetails != null) { - ObjectMapper objectMapper = new ObjectMapper(); - try { - String jsonResponse = objectMapper.writeValueAsString(itemDetails); - return Response.ok(jsonResponse).build(); - } catch (JsonProcessingException e) { - e.printStackTrace(); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR) - .entity("{\"error\":\"Error converting ItemDetails to JSON\"}") - .build(); - } - } else { - return Response.status(Response.Status.NOT_FOUND).entity("{\"error\":\"Item details not found\"}").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 itemDetails from the database. - * - * @return a list of items retrieved from the database - */ - private ItemDetails retrieveItemDetails(String dbHost, String itemId) { - DriverManager.setLoginTimeout(5); - - ItemDetails itemDetails = new ItemDetails(); // Declare object outside try blocks - - List itemList = new ArrayList<>(); - List itemOptionList = new ArrayList<>(); - List itemPricesList = new ArrayList<>(); - List itemStockList = new ArrayList<>(); - - try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost,"dtv")) { - // Item section - String itemQuery = "SELECT item_id,item_lvlcode,parent_item_id,item_typcode,create_date,create_user_id,update_date,update_user_id " + - "FROM dtv.itm_item " + - "WHERE organization_id = 1 AND item_id LIKE ?"; - - logger.info(itemQuery); - try (PreparedStatement itemStatement = databaseConnection.getConnection().prepareStatement(itemQuery)) { - // Concatenate % to parameter itemId - itemStatement.setString(1, itemId + "%"); - - try (ResultSet itemResultSet = itemStatement.executeQuery()) { - while (itemResultSet.next()) { - Item item = mapResultSetToItemDetails(itemResultSet); - itemList.add(item); - } - - itemDetails.setItems(itemList); - } - - } - - // item option section - String itemOptionQuery = "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 ?"; - - logger.info(itemOptionQuery); - try (PreparedStatement itemOptionStatement = databaseConnection.getConnection().prepareStatement(itemOptionQuery)) { - // Concatenate % to parameter itemId - itemOptionStatement.setString(1, itemId + "%"); - - try (ResultSet itemOptionResultSet = itemOptionStatement.executeQuery()) { - while (itemOptionResultSet.next()) { - ItemOption itemOption = mapResultSetToItemOptionDetails(itemOptionResultSet); - itemOptionList.add(itemOption); - } - - itemDetails.setItemOptions(itemOptionList); - } - } - - // item option price - String itemPricesQuery = "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 ?"; - - logger.info(itemPricesQuery); - try (PreparedStatement itemPricesStatement = databaseConnection.getConnection().prepareStatement(itemPricesQuery)) { - // Concatenate % to parameter itemId - itemPricesStatement.setString(1, itemId + "%"); - - try (ResultSet itemPricesResultSet = itemPricesStatement.executeQuery()) { - while (itemPricesResultSet.next()) { - ItemPrices itemPrices = mapResultSetToItemPricesDetails(itemPricesResultSet); - itemPricesList.add(itemPrices); - } - - itemDetails.setItemPrices(itemPricesList); - } - } - - // item stock section - String ItemStockQuery = "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 ?"; - - logger.info(ItemStockQuery); - try (PreparedStatement itemStockStatement = databaseConnection.getConnection().prepareStatement(ItemStockQuery)) { - // Concatenate % to parameter itemId - itemStockStatement.setString(1, itemId + "%"); - - try (ResultSet itemStockResultSet = itemStockStatement.executeQuery()) { - while (itemStockResultSet.next()) { - ItemStock itemStock = mapResultSetToItemStockDetails(itemStockResultSet); - itemStockList.add(itemStock); - } - - itemDetails.setItemStock(itemStockList); - } - } - } catch (SQLException e) { - e.printStackTrace(); - // Handle exceptions correctly in a production environment - } - - // Return the complete ItemDetails object - return itemDetails; - } - - private Item mapResultSetToItemDetails(ResultSet resultSet) throws SQLException { - Item item = new Item(); - - item.setItemId(resultSet.getString("ITEM_ID")); - item.setItemLevelCode(resultSet.getString("ITEM_LVLCODE")); - item.setParentItemId(resultSet.getString("PARENT_ITEM_ID")); - item.setItemTypeCode(resultSet.getString("ITEM_TYPCODE")); - item.setCreateDate(resultSet.getDate("CREATE_DATE")); - item.setCreateUserId(resultSet.getString("CREATE_USER_ID")); - item.setUpdateDate(resultSet.getDate("UPDATE_DATE")); - item.setUpdateUserId(resultSet.getString("UPDATE_USER_ID")); - - return item; - } - private ItemOption mapResultSetToItemOptionDetails(ResultSet resultSet) throws SQLException { ItemOption itemOption = new ItemOption(); @@ -294,9 +290,8 @@ public class ItemService { return itemOption; } - private ItemPrices mapResultSetToItemPricesDetails(ResultSet resultSet) throws SQLException { - - ItemPrices itemPrices = new ItemPrices(); + private ItemPrice mapResultSetToItemPriceDetails(ResultSet resultSet) throws SQLException { + ItemPrice itemPrices = new ItemPrice(); itemPrices.setItemId(resultSet.getString("ITEM_ID")); itemPrices.setLevelCode(resultSet.getString("LEVEL_CODE")); @@ -317,7 +312,6 @@ public class ItemService { } private ItemStock mapResultSetToItemStockDetails(ResultSet resultSet) throws SQLException { - ItemStock itemStock = new ItemStock(); itemStock.setOrganizationId(resultSet.getString("ORGANIZATION_ID")); diff --git a/src/main/java/com/example/services/StoreService.java b/src/main/java/com/example/services/StoreService.java index fa12d4e..e0cadc8 100644 --- a/src/main/java/com/example/services/StoreService.java +++ b/src/main/java/com/example/services/StoreService.java @@ -50,7 +50,15 @@ public class StoreService { DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes try (DatabaseConnectDOTSOFT databaseConnection = new DatabaseConnectDOTSOFT("com02")) { - String query = "SELECT id_structure,nom,'10.100.0.18' AS ip, tel1 AS telephone FROM structure WHERE id_structure = ?" ; + String query = "SELECT st.id_structure,TRIM(st.nom) as nom,'xxx.xxx.xxx.xxx' AS ip, 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 " + + "FROM COM02.structure st " + + "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 " + + "WHERE st.id_structure = ?"; + + logger.info(query); try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query)) { statement.setString(1, storeId); @@ -58,7 +66,7 @@ public class StoreService { try (ResultSet resultSet = statement.executeQuery()) { if (resultSet.next()) { Store store = mapResultSetTostore(resultSet); - + ObjectMapper objectMapper = new ObjectMapper(); String jsonResponse = objectMapper.writeValueAsString(store); return Response.ok(jsonResponse).build(); @@ -100,18 +108,14 @@ 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(); } } @@ -125,13 +129,15 @@ public class StoreService { try (DatabaseConnectDOTSOFT databaseConnection = new DatabaseConnectDOTSOFT("com02")) { String query = "SELECT st.id_structure, TRIM(st.nom) as nom, hsc.ip, " + - "st.tel1 AS telephone " + + "st.tel1 AS telephone, st.enseigne, null AS photoLink " + "FROM COM02.STRUCTURE st " + "LEFT OUTER JOIN omni.ASPD_XSTO_STRUCTURE axs ON st.ID_STRUCTURE = axs.ID_STRUCTURE " + "JOIN COM02.hotline_structure_caisse hsc ON hsc.id_structure = st.id_structure AND hsc.id_caisse = 1 " + - "WHERE st.id_structure < 9999 AND hsc.ip IS NOT NULL AND st.ID_NIVEAU=4 AND st.STATUT=2 " + + "WHERE axs.date_stock is not null and st.id_structure < 9999 AND hsc.ip IS NOT NULL AND st.ID_NIVEAU=4 AND st.STATUT=2 " + "ORDER BY st.id_structure"; - + + logger.info(query); + try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query); ResultSet resultSet = statement.executeQuery()) { @@ -150,6 +156,146 @@ public class StoreService { } } + @GET + @Path("/sequence") + @Produces(MediaType.APPLICATION_JSON) + public Response getSequence( + @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 (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"; + + 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("/signature") + @Produces(MediaType.APPLICATION_JSON) + public Response getSignature( + @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 (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"; + + 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("/version") + @Produces(MediaType.APPLICATION_JSON) + public Response getVersion( + @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 (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"; + + 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(); + } + } + /** * Maps a ResultSet to a store object. * @@ -164,6 +310,8 @@ public class StoreService { 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")); return store; } @@ -186,19 +334,15 @@ public class StoreService { try { StoreDetails storeDetails = retrieveStoreDetails(dbHost,storeId); - if (storeDetails != null) { - 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(); - } - } else { - return Response.status(Response.Status.NOT_FOUND).entity("{\"error\":\"Store details not found\"}").build(); + 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 @@ -216,13 +360,16 @@ public class StoreService { DriverManager.setLoginTimeout(5); StoreDetails storeDetails = new StoreDetails(); // Déclarer l'objet en dehors des blocs try - + try (DatabaseConnectDOTSOFT databaseConnection = new DatabaseConnectDOTSOFT("com02")) { // Store section - String storeQuery = "SELECT st.id_structure, TRIM(st.nom) as nom, '10.100.0.18' AS ip, " + - "st.tel1 AS telephone, 'https://mp4.ikksgroup.com/photos/1/6/5/7/3/16573-large.JPG' as photoLink " + - "FROM COM02.STRUCTURE st " + - "WHERE st.id_structure = ?"; + String storeQuery = "SELECT st.id_structure,TRIM(st.nom) as nom,'xxx.xxx.xxx.xxx' AS ip, 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 " + + "FROM COM02.structure st " + + "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 " + + "WHERE st.id_structure = ?"; logger.info(storeQuery); try (PreparedStatement storeStatement = databaseConnection.getConnection().prepareStatement(storeQuery)) { @@ -301,8 +448,9 @@ public class StoreService { String ip = resultSet.getString("ip"); String telephone = resultSet.getString("telephone"); String photoLink = resultSet.getString("photoLink"); + String enseigne = resultSet.getString("enseigne"); - return new Store(id_structure, nom, ip, telephone, photoLink); + return new Store(id_structure, nom, ip, telephone, photoLink, enseigne); } private StoreReplication mapResultSetToStoreReplication(ResultSet resultSet) throws SQLException { @@ -323,4 +471,53 @@ public class StoreService { return new BackOfficeTransaction(backOfficeTransactionOk, backofficeTransactions, minBackofficeTransactionDate, maxBackofficeTransactionDate, backOfficeBusinessDate); } + + 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/item/ItemDetails.java b/src/main/java/com/example/services/item/ItemDetails.java deleted file mode 100644 index 134a137..0000000 --- a/src/main/java/com/example/services/item/ItemDetails.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.example.services.item; - -import java.util.List; - -public class ItemDetails { - private List items; - private List itemOptions; - private List itemPrices; - private List itemStock; - - public ItemDetails() { - // Default constructor required for JSON deserialization - } - - public ItemDetails(List items, List itemOptions, List itemPrices, List itemStocks) { - this.items = items; - this.itemOptions = itemOptions; - this.itemPrices = itemPrices; - this.itemStock = itemStocks; - } - - public List getItems() { - return items; - } - - public void setItems(List items) { - this.items = items; - } - - public List getItemOptions() { - return itemOptions; - } - - public void setItemOptions(List itemOptions) { - this.itemOptions = itemOptions; - } - - public List getItemPrices() { - return itemPrices; - } - - public void setItemPrices(List itemPrices) { - this.itemPrices = itemPrices; - } - - public List getItemStock() { - return itemStock; - } - - public void setItemStock(List itemStocks) { - this.itemStock = itemStocks; - } -} diff --git a/src/main/java/com/example/services/item/ItemPrices.java b/src/main/java/com/example/services/item/ItemPrice.java similarity index 98% rename from src/main/java/com/example/services/item/ItemPrices.java rename to src/main/java/com/example/services/item/ItemPrice.java index 5086986..af9fb47 100644 --- a/src/main/java/com/example/services/item/ItemPrices.java +++ b/src/main/java/com/example/services/item/ItemPrice.java @@ -3,7 +3,7 @@ package com.example.services.item; import java.sql.Date; import java.text.SimpleDateFormat; -public class ItemPrices { +public class ItemPrice { private String itemId; private String levelCode; private String levelValue; @@ -19,7 +19,7 @@ public class ItemPrices { private Date updateDate; private String updateUserId; - public ItemPrices() { + public ItemPrice() { // Default constructor required for JSON deserialization } diff --git a/src/main/java/com/example/services/store/BackOfficeTransaction.java b/src/main/java/com/example/services/store/BackOfficeTransaction.java index fb88302..4210ca4 100644 --- a/src/main/java/com/example/services/store/BackOfficeTransaction.java +++ b/src/main/java/com/example/services/store/BackOfficeTransaction.java @@ -11,12 +11,12 @@ public class BackOfficeTransaction { private Date backOfficeBusinessDate; - // Constructeur par défaut + // Default constructor public BackOfficeTransaction() { // Default constructor required for JSON deserialization } - // Constructeur avec paramètres + // Constructor with parameters public BackOfficeTransaction(boolean backOfficeTransactionOk, int backOfficeTransactions, Date minbackOfficeTransactionDate, Date maxbackOfficeTransactionDate, Date backOfficeBusinessDate) { this.backOfficeTransactionOk = backOfficeTransactionOk; this.backOfficeTransactions = backOfficeTransactions; diff --git a/src/main/java/com/example/services/store/Store.java b/src/main/java/com/example/services/store/Store.java index b4e3104..a9acb60 100644 --- a/src/main/java/com/example/services/store/Store.java +++ b/src/main/java/com/example/services/store/Store.java @@ -6,6 +6,7 @@ public class Store { private String ip; private String telephone; private String photoLink; + private String enseigne; // Default constructor @@ -14,12 +15,13 @@ public class Store { } // Constructor with parameters - public Store(Integer id_structure, String nom, String ip, String telephone, String photoLink) { + public Store(Integer id_structure, String nom, String ip, String telephone, String photoLink, String enseigne) { this.id_structure = id_structure; this.nom = nom; this.ip = ip; this.telephone = telephone; this.photoLink = photoLink; + this.enseigne = enseigne; } public Integer getId_structure() { @@ -61,4 +63,12 @@ public class Store { public void setPhotoLink(String photoLink) { this.photoLink = photoLink; } + + public String getEnseigne() { + return enseigne; + } + + public void setEnseigne(String enseigne) { + this.enseigne = enseigne; + } } diff --git a/src/main/java/com/example/services/store/StoreDetails.java b/src/main/java/com/example/services/store/StoreDetails.java index 2b66db3..e9efcdf 100644 --- a/src/main/java/com/example/services/store/StoreDetails.java +++ b/src/main/java/com/example/services/store/StoreDetails.java @@ -4,7 +4,7 @@ public class StoreDetails { private Store store; private StoreReplication replication; private BackOfficeTransaction transaction; - + public StoreDetails() { // Constructeur par défaut nécessaire pour la désérialisation JSON } 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 From 844515f6402bfff57e3a729dd9060d1353f222f5 Mon Sep 17 00:00:00 2001 From: fbenoist68 Date: Wed, 29 Nov 2023 00:03:34 +0100 Subject: [PATCH 07/16] fix: change dependency version to work in PROD --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 74cddc5..ae6ec97 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 @@ -59,14 +59,14 @@ ch.qos.logback logback-core - 1.4.11 + 1.3.0 ch.qos.logback logback-classic - 1.4.11 + 1.3.0 From 1020d4ad1efa95a3d1310a2ab4b091ef11b69825 Mon Sep 17 00:00:00 2001 From: fbenoist68 Date: Fri, 15 Dec 2023 23:39:03 +0100 Subject: [PATCH 08/16] feat: store detail adjustment / authentification --- pom.xml | 10 ++ src/main/java/com/example/CorsFilters.java | 1 + .../com/example/services/AuthService.java | 144 ++++++++++++++++++ .../com/example/services/StoreService.java | 112 ++++++++++---- .../com/example/services/store/Store.java | 89 +++++++++-- src/main/webapp/WEB-INF/web.xml | 4 + 6 files changed, 318 insertions(+), 42 deletions(-) create mode 100644 src/main/java/com/example/services/AuthService.java diff --git a/pom.xml b/pom.xml index ae6ec97..aba3cfa 100644 --- a/pom.xml +++ b/pom.xml @@ -54,6 +54,16 @@ jackson-databind 2.13.0 + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + 2.13.0 + + + org.glassfish.jersey.media + jersey-media-json-jackson + 2.13 + 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/StoreService.java b/src/main/java/com/example/services/StoreService.java index e0cadc8..25a29f4 100644 --- a/src/main/java/com/example/services/StoreService.java +++ b/src/main/java/com/example/services/StoreService.java @@ -4,6 +4,7 @@ import com.example.services.store.*; 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; @@ -40,9 +41,9 @@ public class StoreService { * @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(); } @@ -50,13 +51,26 @@ public class StoreService { DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes try (DatabaseConnectDOTSOFT databaseConnection = new DatabaseConnectDOTSOFT("com02")) { - String query = "SELECT st.id_structure,TRIM(st.nom) as nom,'xxx.xxx.xxx.xxx' AS ip, 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 " + - "FROM COM02.structure st " + - "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 " + - "WHERE st.id_structure = ?"; + 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" + + " 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" + + " WHERE st.id_structure = ?"; logger.info(query); @@ -69,6 +83,7 @@ public class StoreService { 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(); @@ -91,7 +106,6 @@ public class StoreService { * @return A JSON response containing the list of stores */ @GET - @Path("/getAll") @Produces(MediaType.APPLICATION_JSON) public Response getAllStores() { if (cachedStoreList == null) { @@ -128,13 +142,28 @@ public class StoreService { DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes try (DatabaseConnectDOTSOFT databaseConnection = new DatabaseConnectDOTSOFT("com02")) { - String query = "SELECT st.id_structure, TRIM(st.nom) as nom, hsc.ip, " + - "st.tel1 AS telephone, st.enseigne, null AS photoLink " + - "FROM COM02.STRUCTURE st " + - "LEFT OUTER JOIN omni.ASPD_XSTO_STRUCTURE axs ON st.ID_STRUCTURE = axs.ID_STRUCTURE " + - "JOIN COM02.hotline_structure_caisse hsc ON hsc.id_structure = st.id_structure AND hsc.id_caisse = 1 " + - "WHERE axs.date_stock is not null and st.id_structure < 9999 AND hsc.ip IS NOT NULL AND st.ID_NIVEAU=4 AND st.STATUT=2 " + - "ORDER BY st.id_structure"; + 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" + + " 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); @@ -308,20 +337,22 @@ public class StoreService { 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")); return store; } @GET - @Path("/getStoreDetails") + @Path("/{storeId}/details") @Produces(MediaType.APPLICATION_JSON) public Response getStoreDetails( - @QueryParam("dbHost") String dbHost, - @QueryParam("storeId") Integer storeId) { + @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(); @@ -359,17 +390,30 @@ public class StoreService { private StoreDetails retrieveStoreDetails(String dbHost, Integer storeId) { DriverManager.setLoginTimeout(5); - StoreDetails storeDetails = new StoreDetails(); // Déclarer l'objet en dehors des blocs try + StoreDetails storeDetails = new StoreDetails(); // Declare object outside try blocks try (DatabaseConnectDOTSOFT databaseConnection = new DatabaseConnectDOTSOFT("com02")) { - // Store section - String storeQuery = "SELECT st.id_structure,TRIM(st.nom) as nom,'xxx.xxx.xxx.xxx' AS ip, 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 " + - "FROM COM02.structure st " + - "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 " + - "WHERE st.id_structure = ?"; + // Store section FRED + 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" + + " 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" + + " WHERE st.id_structure = ?"; logger.info(storeQuery); try (PreparedStatement storeStatement = databaseConnection.getConnection().prepareStatement(storeQuery)) { @@ -445,12 +489,14 @@ public class StoreService { private Store mapResultSetToStore(ResultSet resultSet) throws SQLException { Integer id_structure = resultSet.getInt("id_structure"); String nom = resultSet.getString("nom"); - String ip = resultSet.getString("ip"); String telephone = resultSet.getString("telephone"); String photoLink = resultSet.getString("photoLink"); String enseigne = resultSet.getString("enseigne"); - - return new Store(id_structure, nom, ip, telephone, photoLink, enseigne); + String pays = resultSet.getString("pays"); + String caisses = resultSet.getString("caisses"); + String adresse = resultSet.getString("adresse"); + + return new Store(id_structure, nom, telephone, photoLink, enseigne, pays, caisses, adresse); } private StoreReplication mapResultSetToStoreReplication(ResultSet resultSet) throws SQLException { diff --git a/src/main/java/com/example/services/store/Store.java b/src/main/java/com/example/services/store/Store.java index a9acb60..284ecfd 100644 --- a/src/main/java/com/example/services/store/Store.java +++ b/src/main/java/com/example/services/store/Store.java @@ -1,13 +1,21 @@ package com.example.services.store; +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; + 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; // Default constructor public Store() { @@ -15,13 +23,16 @@ public class Store { } // Constructor with parameters - public Store(Integer id_structure, String nom, String ip, String telephone, String photoLink, String enseigne) { + public Store(Integer id_structure, String nom, String telephone, String photoLink, String enseigne, String pays, String caisses, String adresse) { this.id_structure = id_structure; this.nom = nom; - this.ip = ip; this.telephone = telephone; this.photoLink = photoLink; this.enseigne = enseigne; + this.pays = pays; + this.adresse = adresse; + + setCaisses(caisses); } public Integer getId_structure() { @@ -40,12 +51,12 @@ public class Store { this.nom = nom; } - public String getIp() { - return ip; - } + public String getIp_master() { + if (!this.caisses.isEmpty()) { + return this.caisses.get(0).getIp(); + } - public void setIp(String ip) { - this.ip = ip; + return ""; } public String getTelephone() { @@ -71,4 +82,64 @@ public class Store { 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 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/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 From 66f98461e5673f06d6b12984e0d9e6da82dd0c2a Mon Sep 17 00:00:00 2001 From: fbenoist68 Date: Sun, 17 Dec 2023 23:59:01 +0100 Subject: [PATCH 09/16] feat: store detail ok --- .../com/example/services/StoreService.java | 239 +++++++++++++++--- .../services/store/BackOfficeTransaction.java | 13 +- .../example/services/store/StoreDetails.java | 71 +++++- .../services/store/StoreReplication.java | 13 +- .../services/store/XstoreTransaction.java | 98 +++++++ 5 files changed, 368 insertions(+), 66 deletions(-) create mode 100644 src/main/java/com/example/services/store/XstoreTransaction.java diff --git a/src/main/java/com/example/services/StoreService.java b/src/main/java/com/example/services/StoreService.java index 25a29f4..eab128b 100644 --- a/src/main/java/com/example/services/StoreService.java +++ b/src/main/java/com/example/services/StoreService.java @@ -186,11 +186,16 @@ public class StoreService { } @GET - @Path("/sequence") + @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(); } @@ -233,11 +238,16 @@ public class StoreService { } @GET - @Path("/signature") + @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(); } @@ -279,11 +289,16 @@ public class StoreService { } @GET - @Path("/version") + @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(); } @@ -352,7 +367,8 @@ public class StoreService { @Produces(MediaType.APPLICATION_JSON) public Response getStoreDetails( @PathParam("storeId") Integer storeId, - @QueryParam("dbHost") String dbHost) { + @QueryParam("dbHost") String dbHost, + @QueryParam("workstationId") Integer workstationId) { if (dbHost == null) { return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"dbHost parameter is required\"}").build(); @@ -363,7 +379,7 @@ public class StoreService { } try { - StoreDetails storeDetails = retrieveStoreDetails(dbHost,storeId); + StoreDetails storeDetails = retrieveStoreDetails(dbHost,storeId,workstationId); ObjectMapper objectMapper = new ObjectMapper(); try { @@ -385,15 +401,159 @@ public class StoreService { /** * Retrieves storeDetails from the database. * - * @return a list of stores retrieved from the database - */ - private StoreDetails retrieveStoreDetails(String dbHost, Integer storeId) { + * @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, Integer workstationId) { DriverManager.setLoginTimeout(5); StoreDetails storeDetails = new StoreDetails(); // Declare object outside try blocks + try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost,"dtv")) { + // 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"; + + logger.info(replicationQuery); + try (PreparedStatement storeStatement = databaseConnection.getConnection().prepareStatement(replicationQuery); + ResultSet storeReplicationResultSet = storeStatement.executeQuery()) { + + if (storeReplicationResultSet.next()) { + StoreReplication storeReplication = mapResultSetToStoreReplication(storeReplicationResultSet); + storeDetails.setReplication(storeReplication); + } else { + // Adjust to the desired behavior if no results are found + } + } + + // opening transation section + String openingTransactionQuery = "SELECT"+ + " COUNT(*) AS counter,"+ + " MIN(tt.END_DATETIME) AS minDate,"+ + " MAX(tt.END_DATETIME) AS maxDate"+ + " FROM"+ + " trn_trans tt"+ + " WHERE"+ + " tt.BUSINESS_DATE = ("+ + " SELECT"+ + " MAX(tt_bdate.BUSINESS_DATE) as bd"+ + " FROM"+ + " trn_trans tt_bdate"+ + " WHERE"+ + " tt_bdate.trans_TYPCODE = 'WORKSTATION_OPEN'"+ + " AND tt_bdate.TRANS_STATCODE = 'COMPLETE'"+ + " )"+ + " AND tt.trans_TYPCODE = 'WORKSTATION_OPEN'"+ + " AND tt.TRANS_STATCODE = 'COMPLETE'" ; + + logger.info(openingTransactionQuery); + try (PreparedStatement storeStatement = databaseConnection.getConnection().prepareStatement(openingTransactionQuery); + ResultSet openingTransactionResultSet = storeStatement.executeQuery()) { + + if (openingTransactionResultSet.next()) { + XstoreTransaction openingTransaction = mapResultSetToXstoreOpeningTransaction(openingTransactionResultSet); + storeDetails.setOpeningTransaction(openingTransaction); + } else { + // Adjust to the desired behavior if no results are found + } + } + + // Closing transation section + String closingTransactionQuery = "SELECT"+ + " COUNT(*) AS counter,"+ + " MIN(tt.END_DATETIME) AS minDate,"+ + " MAX(tt.END_DATETIME) AS maxDate"+ + " FROM"+ + " trn_trans tt"+ + " WHERE"+ + " tt.BUSINESS_DATE = ("+ + " SELECT"+ + " MAX(tt_bdate.BUSINESS_DATE)"+ + " FROM"+ + " trn_trans tt_bdate"+ + " WHERE"+ + " tt_bdate.trans_TYPCODE = 'WORKSTATION_OPEN'"+ + " AND tt_bdate.TRANS_STATCODE = 'COMPLETE'"+ + " )"+ + " AND tt.trans_TYPCODE = 'WORKSTATION_CLOSE'"+ + " AND tt.TRANS_STATCODE = 'COMPLETE'"; + + logger.info(closingTransactionQuery); + try (PreparedStatement storeStatement = databaseConnection.getConnection().prepareStatement(closingTransactionQuery); + ResultSet closingTransactionResultSet = storeStatement.executeQuery()) { + + if (closingTransactionResultSet.next()) { + XstoreTransaction closingTransaction = mapResultSetToXstoreClosingTransaction(closingTransactionResultSet); + storeDetails.setClosingTransaction(closingTransaction); + } 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"+ + " trn_trans tt"+ + " WHERE"+ + " tt.BUSINESS_DATE = ("+ + " SELECT"+ + " MAX(tt_bdate.BUSINESS_DATE)"+ + " FROM"+ + " trn_trans tt_bdate"+ + " WHERE"+ + " tt_bdate.trans_TYPCODE = 'WORKSTATION_OPEN'"+ + " AND tt_bdate.TRANS_STATCODE = 'COMPLETE'"+ + " )"+ + " AND tt.trans_TYPCODE = 'RETAIL_SALE'"+ + " AND tt.TRANS_STATCODE = 'COMPLETE'"; + + logger.info(saleTransactionQuery); + try (PreparedStatement storeStatement = databaseConnection.getConnection().prepareStatement(saleTransactionQuery); + ResultSet saleTransactionResultSet = storeStatement.executeQuery()) { + + if (saleTransactionResultSet.next()) { + XstoreTransaction saleTransaction = mapResultSetToXstoreSaleTransaction(saleTransactionResultSet); + storeDetails.setSaleTransaction(saleTransaction); + } else { + // Adjust to the desired behavior if no results are found + } + } + + // version section + String versionQuery = "SELECT * FROM ( " + + " SELECT CUSTOMER,CUSTOMER_SCHEMA_VERSION,CUSTOMER_SCHEMA_DATE" + + " FROM dtv.CTL_VERSION_HISTORY" + + " WHERE organization_id = 1 AND customer IS NOT NULL" + + " ORDER BY seq DESC" + + " ) " + + " WHERE ROWNUM = 1"; + + logger.info(versionQuery); + try (PreparedStatement versionStatement = databaseConnection.getConnection().prepareStatement(versionQuery)) { + try (ResultSet versionResultSet = versionStatement.executeQuery()) { + if (versionResultSet.next()) { + storeDetails.setXstoreVersion(versionResultSet.getString("CUSTOMER_SCHEMA_VERSION")); + storeDetails.setXstoreVersionDate(versionResultSet.getDate("CUSTOMER_SCHEMA_DATE")); + storeDetails.setXstoreVersionCustomer(versionResultSet.getString("CUSTOMER")); + } else { + // Adjust to the desired behavior if no results are found + } + } + } + } catch (SQLException e) { + e.printStackTrace(); + // Handle exceptions correctly in a production environment + } + try (DatabaseConnectDOTSOFT databaseConnection = new DatabaseConnectDOTSOFT("com02")) { - // Store section FRED + // Store section String storeQuery = "SELECT st.id_structure," + " TRIM(st.nom) as nom," + " st.tel1 as telephone," + @@ -424,7 +584,7 @@ public class StoreService { Store store = mapResultSetToStore(storeResultSet); storeDetails.setStore(store); } else { - // Adjust to the desired behavior if no results are found for the Store part. + // Adjust to the desired behavior if no results are found } } } @@ -433,8 +593,7 @@ public class StoreService { String transactionQuery = "SELECT COUNT(*) as backOfficeTransactions, " + " MIN(cf.fdate_integration) AS minBackOfficeTransactionDate, " + " MAX(cf.fdate_integration) AS maxBackOfficeTransactionDate, " + - " TRUNC(MAX(cf.fdate)) AS backOfficeBusinessDate, " + - " CASE WHEN TRUNC(MAX(cf.fdate)) = TRUNC(SYSDATE )THEN 1 ELSE 0 END AS backOfficeTransactionOk "+ + " TRUNC(MAX(cf.fdate)) AS backOfficeBusinessDate " + "FROM com02.client_facture cf " + "WHERE cf.id_structure = ? " + "AND TRUNC(cf.fdate_integration) = TRUNC(SYSDATE) " + //TODO : changer la date @@ -449,7 +608,7 @@ public class StoreService { BackOfficeTransaction storetransaction = mapResultSetToBackOfficetransaction(transactionResultSet); storeDetails.setTransaction(storetransaction); } else { - // Adjust to the desired behavior if no results are found for the transaction section. + // Adjust to the desired behavior if no results are found } } } @@ -458,30 +617,6 @@ public class StoreService { // Handle exceptions correctly in a production environment } - try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost,"dtv")) { - // Replication section - String replicationQuery = "SELECT COUNT(*) AS pendingReplications, " + - "MIN(crq.CREATE_DATE) AS minPendingReplicationDate, " + - "MAX(crq.CREATE_DATE) AS maxPendingReplicationDate, " + - "CASE WHEN MIN(crq.CREATE_DATE) IS NULL OR MIN(crq.CREATE_DATE) > SYSDATE - INTERVAL '5' MINUTE THEN 1 ELSE 0 END AS pendingReplicationOk "+ - "FROM repqueue.CTL_REPLICATION_QUEUE crq"; - - logger.info(replicationQuery); - try (PreparedStatement storeStatement = databaseConnection.getConnection().prepareStatement(replicationQuery); - ResultSet storeReplicationResultSet = storeStatement.executeQuery()) { - - if (storeReplicationResultSet.next()) { - StoreReplication storeReplication = mapResultSetToStoreReplication(storeReplicationResultSet); - storeDetails.setReplication(storeReplication); - } else { - // Adjust to the desired behavior if no results are found for the Replication section. - } - } - } catch (SQLException e) { - e.printStackTrace(); - // Handle exceptions correctly in a production environment - } - // Return the complete StoreDetails object return storeDetails; } @@ -500,22 +635,44 @@ public class StoreService { } private StoreReplication mapResultSetToStoreReplication(ResultSet resultSet) throws SQLException { - boolean pendingReplicationOk = resultSet.getBoolean("pendingReplicationOk"); int pendingReplications = resultSet.getInt("pendingReplications"); Date minPendingReplicationDate = resultSet.getDate("minPendingReplicationDate"); Date maxPendingReplicationDate = resultSet.getDate("maxPendingReplicationDate"); - return new StoreReplication(pendingReplicationOk, pendingReplications, minPendingReplicationDate, maxPendingReplicationDate); + return new StoreReplication(pendingReplications, minPendingReplicationDate, maxPendingReplicationDate); + } + + private XstoreTransaction mapResultSetToXstoreOpeningTransaction(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 XstoreTransaction mapResultSetToXstoreClosingTransaction(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 XstoreTransaction mapResultSetToXstoreSaleTransaction(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 mapResultSetToBackOfficetransaction(ResultSet resultSet) throws SQLException { - boolean backOfficeTransactionOk = resultSet.getBoolean("backOfficeTransactionOk"); int backofficeTransactions = resultSet.getInt("backOfficeTransactions"); Date minBackofficeTransactionDate = resultSet.getDate("minBackOfficeTransactionDate"); Date maxBackofficeTransactionDate = resultSet.getDate("maxBackOfficeTransactionDate"); Date backOfficeBusinessDate = resultSet.getDate("backOfficeBusinessDate"); - return new BackOfficeTransaction(backOfficeTransactionOk, backofficeTransactions, minBackofficeTransactionDate, maxBackofficeTransactionDate, backOfficeBusinessDate); + return new BackOfficeTransaction(backofficeTransactions, minBackofficeTransactionDate, maxBackofficeTransactionDate, backOfficeBusinessDate); } private StoreVersion mapResultSetToStoreVersion(ResultSet resultSet) throws SQLException { diff --git a/src/main/java/com/example/services/store/BackOfficeTransaction.java b/src/main/java/com/example/services/store/BackOfficeTransaction.java index 4210ca4..041f32a 100644 --- a/src/main/java/com/example/services/store/BackOfficeTransaction.java +++ b/src/main/java/com/example/services/store/BackOfficeTransaction.java @@ -4,7 +4,6 @@ import java.sql.Date; import java.text.SimpleDateFormat; public class BackOfficeTransaction { - private boolean backOfficeTransactionOk; private int backOfficeTransactions; private Date minBackOfficeTransactionDate; private Date maxBackOfficeTransactionDate; @@ -17,8 +16,7 @@ public class BackOfficeTransaction { } // Constructor with parameters - public BackOfficeTransaction(boolean backOfficeTransactionOk, int backOfficeTransactions, Date minbackOfficeTransactionDate, Date maxbackOfficeTransactionDate, Date backOfficeBusinessDate) { - this.backOfficeTransactionOk = backOfficeTransactionOk; + public BackOfficeTransaction(int backOfficeTransactions, Date minbackOfficeTransactionDate, Date maxbackOfficeTransactionDate, Date backOfficeBusinessDate) { this.backOfficeTransactions = backOfficeTransactions; this.minBackOfficeTransactionDate = minbackOfficeTransactionDate; this.maxBackOfficeTransactionDate = maxbackOfficeTransactionDate; @@ -26,15 +24,6 @@ public class BackOfficeTransaction { } // Getters et setters - - public boolean isBackOfficeTransactionOk() { - return backOfficeTransactionOk; - } - - public void setBackOfficeTransactionOk(boolean backOfficeTransactionOk) { - this.backOfficeTransactionOk = backOfficeTransactionOk; - } - public int getBackOfficeTransactions() { return backOfficeTransactions; } diff --git a/src/main/java/com/example/services/store/StoreDetails.java b/src/main/java/com/example/services/store/StoreDetails.java index e9efcdf..7fca3ae 100644 --- a/src/main/java/com/example/services/store/StoreDetails.java +++ b/src/main/java/com/example/services/store/StoreDetails.java @@ -1,18 +1,34 @@ package com.example.services.store; +import java.sql.Date; +import java.text.SimpleDateFormat; + public class StoreDetails { private Store store; private StoreReplication replication; private BackOfficeTransaction transaction; + private XstoreTransaction openingTransaction; + private XstoreTransaction closingTransaction; + private XstoreTransaction saleTransaction; + private String xstoreVersion; + private Date xstoreVersionDate; + private String xstoreVersionCustomer; + public StoreDetails() { // Constructeur par défaut nécessaire pour la désérialisation JSON } - public StoreDetails(Store store, StoreReplication replication, BackOfficeTransaction transaction) { + public StoreDetails(Store store, StoreReplication replication, BackOfficeTransaction transaction, XstoreTransaction openingTransaction, XstoreTransaction closingTransaction, XstoreTransaction saleTransaction, String xstoreVersion, Date xstoreVersionDate, String xstoreVersionCustomer) { this.store = store; this.replication = replication; this.transaction = transaction; + this.openingTransaction = openingTransaction; + this.closingTransaction = closingTransaction; + this.saleTransaction = saleTransaction; + this.xstoreVersion = xstoreVersion; + this.xstoreVersionDate = xstoreVersionDate; + this.xstoreVersionCustomer = xstoreVersionCustomer; } public Store getStore() { @@ -38,5 +54,58 @@ public class StoreDetails { public void setTransaction(BackOfficeTransaction transaction) { this.transaction = transaction; } + + public XstoreTransaction getOpeningTransaction() { + return openingTransaction; + } + + public void setOpeningTransaction(XstoreTransaction openingTransaction) { + this.openingTransaction = openingTransaction; + } + + public XstoreTransaction getClosingTransaction() { + return closingTransaction; + } + + public void setClosingTransaction(XstoreTransaction closingTransaction) { + this.closingTransaction = closingTransaction; + } + + public XstoreTransaction getSaleTransaction() { + return saleTransaction; + } + + public void setSaleTransaction(XstoreTransaction saleTransaction) { + this.saleTransaction = saleTransaction; + } + + public String getXstoreVersion() { + return xstoreVersion; + } + + public void setXstoreVersion(String xstoreVersion) { + this.xstoreVersion = xstoreVersion; + } + + public String getXstoreVersionDate() { + if (xstoreVersionDate != null) { + SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return dateFormat.format(xstoreVersionDate); + } else { + return ""; + } + } + + public void setXstoreVersionDate(Date xstoreVersionDate) { + this.xstoreVersionDate = xstoreVersionDate; + } + + public String getXstoreVersionCustomer() { + return xstoreVersionCustomer; + } + + public void setXstoreVersionCustomer(String xstoreVersionCustomer) { + this.xstoreVersionCustomer = xstoreVersionCustomer; + } } diff --git a/src/main/java/com/example/services/store/StoreReplication.java b/src/main/java/com/example/services/store/StoreReplication.java index 3491ae2..7fe3011 100644 --- a/src/main/java/com/example/services/store/StoreReplication.java +++ b/src/main/java/com/example/services/store/StoreReplication.java @@ -4,7 +4,6 @@ import java.sql.Date; import java.text.SimpleDateFormat; public class StoreReplication { - private boolean pendingReplicationOk; private int pendingReplications; private Date minPendingReplicationDate; private Date maxPendingReplicationDate; @@ -15,23 +14,13 @@ public class StoreReplication { } // Constructeur avec paramètres - public StoreReplication(boolean pendingReplicationOk, int pendingReplications, Date minPendingReplicationDate, Date maxPendingReplicationDate) { - this.pendingReplicationOk = pendingReplicationOk; + public StoreReplication(int pendingReplications, Date minPendingReplicationDate, Date maxPendingReplicationDate) { this.pendingReplications = pendingReplications; this.minPendingReplicationDate = minPendingReplicationDate; this.maxPendingReplicationDate = maxPendingReplicationDate; } // Getters et setters - - public boolean isPendingReplicationOk() { - return pendingReplicationOk; - } - - public void setPendingReplicationOk(boolean replicationOk) { - this.pendingReplicationOk = replicationOk; - } - public int getPendingReplications() { return pendingReplications; } 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 ""; + } + } +} From a9837bf4f18eb2e036d4523db8ea770b1ff494bf Mon Sep 17 00:00:00 2001 From: fbenoist68 Date: Tue, 19 Dec 2023 08:03:10 +0100 Subject: [PATCH 10/16] feat: add date_migration --- .../com/example/services/StoreService.java | 35 ++++++++++++++++--- .../com/example/services/store/Store.java | 19 +++++++++- 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/services/StoreService.java b/src/main/java/com/example/services/StoreService.java index eab128b..54c0cbd 100644 --- a/src/main/java/com/example/services/StoreService.java +++ b/src/main/java/com/example/services/StoreService.java @@ -65,11 +65,13 @@ public class StoreService { " 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" + + " 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); @@ -100,6 +102,24 @@ public class StoreService { } } + /** + * 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. * @@ -156,12 +176,13 @@ public class StoreService { " 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" + + " 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 " + + " 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"; @@ -358,6 +379,7 @@ public class StoreService { store.setPays(resultSet.getString("PAYS")); store.setCaisses(resultSet.getString("CAISSES")); store.setAdresse(resultSet.getString("ADRESSE")); + store.setDate_migration(resultSet.getDate("DATE_MIGRATION")); return store; } @@ -568,11 +590,13 @@ public class StoreService { " 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" + + " 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); @@ -630,8 +654,9 @@ public class StoreService { 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); + return new Store(id_structure, nom, telephone, photoLink, enseigne, pays, caisses, adresse, date_migration); } private StoreReplication mapResultSetToStoreReplication(ResultSet resultSet) throws SQLException { diff --git a/src/main/java/com/example/services/store/Store.java b/src/main/java/com/example/services/store/Store.java index 284ecfd..6f5b947 100644 --- a/src/main/java/com/example/services/store/Store.java +++ b/src/main/java/com/example/services/store/Store.java @@ -1,5 +1,7 @@ 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; @@ -16,6 +18,7 @@ public class Store { private Integer nbcaisses; private String adresse; private List caisses; + private Date date_migration; // Default constructor public Store() { @@ -23,7 +26,7 @@ public class Store { } // Constructor with parameters - public Store(Integer id_structure, String nom, String telephone, String photoLink, String enseigne, String pays, String caisses, String adresse) { + 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; @@ -31,6 +34,7 @@ public class Store { this.enseigne = enseigne; this.pays = pays; this.adresse = adresse; + this.date_migration = date_migration; setCaisses(caisses); } @@ -117,6 +121,19 @@ public class Store { 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; From 405d1302ac727a73f3057c2faff065fa50d83e1b Mon Sep 17 00:00:00 2001 From: fbenoist68 Date: Fri, 22 Dec 2023 06:39:56 +0100 Subject: [PATCH 11/16] feat: add flux services --- .../com/example/services/FluxService.java | 116 ++++++++++ .../services/flux/bl/FluxBlNotSent.java | 206 ++++++++++++++++++ 2 files changed, 322 insertions(+) create mode 100644 src/main/java/com/example/services/FluxService.java create mode 100644 src/main/java/com/example/services/flux/bl/FluxBlNotSent.java 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..1b7c4d9 --- /dev/null +++ b/src/main/java/com/example/services/FluxService.java @@ -0,0 +1,116 @@ +package com.example.services; + +import com.example.services.flux.bl.*; +import com.example.services.store.Store; +import com.example.services.store.StoreVersion; +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/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; + } +} From 3cae6f2c6906f38af4f8d619bb141d47dec45f7d Mon Sep 17 00:00:00 2001 From: fbenoist68 Date: Fri, 22 Dec 2023 06:40:56 +0100 Subject: [PATCH 12/16] fix: remove unused import --- src/main/java/com/example/services/FluxService.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/example/services/FluxService.java b/src/main/java/com/example/services/FluxService.java index 1b7c4d9..5671ce8 100644 --- a/src/main/java/com/example/services/FluxService.java +++ b/src/main/java/com/example/services/FluxService.java @@ -1,8 +1,6 @@ package com.example.services; import com.example.services.flux.bl.*; -import com.example.services.store.Store; -import com.example.services.store.StoreVersion; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; From 819523c5acc5912cad8ee5af1ca5d062cd42dd0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9rik=20BENOIST?= Date: Sun, 24 Dec 2023 07:44:46 +0100 Subject: [PATCH 13/16] refactor: store details structure --- .../services/DatabaseConnectDOTSOFT.java | 3 +- .../services/DatabaseConnectXSTORE.java | 3 +- .../com/example/services/StoreService.java | 388 ++++++++++-------- .../services/store/BackOfficeTransaction.java | 18 +- ...reReplication.java => PosReplication.java} | 10 +- .../example/services/store/StoreDetails.java | 97 +---- .../com/example/services/store/StorePos.java | 138 +++++++ 7 files changed, 371 insertions(+), 286 deletions(-) rename src/main/java/com/example/services/store/{StoreReplication.java => PosReplication.java} (86%) create mode 100644 src/main/java/com/example/services/store/StorePos.java diff --git a/src/main/java/com/example/services/DatabaseConnectDOTSOFT.java b/src/main/java/com/example/services/DatabaseConnectDOTSOFT.java index a159155..67eb675 100644 --- a/src/main/java/com/example/services/DatabaseConnectDOTSOFT.java +++ b/src/main/java/com/example/services/DatabaseConnectDOTSOFT.java @@ -15,7 +15,7 @@ public class DatabaseConnectDOTSOFT implements AutoCloseable { private Connection connection; - public DatabaseConnectDOTSOFT(String username) { + public DatabaseConnectDOTSOFT(String username) throws SQLException { String environment = loadEnvironment(); try { @@ -29,6 +29,7 @@ public class DatabaseConnectDOTSOFT implements AutoCloseable { 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 } } diff --git a/src/main/java/com/example/services/DatabaseConnectXSTORE.java b/src/main/java/com/example/services/DatabaseConnectXSTORE.java index 9576cc4..91fa3da 100644 --- a/src/main/java/com/example/services/DatabaseConnectXSTORE.java +++ b/src/main/java/com/example/services/DatabaseConnectXSTORE.java @@ -15,7 +15,7 @@ public class DatabaseConnectXSTORE implements AutoCloseable { private Connection connection; - public DatabaseConnectXSTORE(String dbHost, String username) { + public DatabaseConnectXSTORE(String dbHost, String username) throws SQLException { try { Properties dbProperties = loadDatabaseProperties(); @@ -27,6 +27,7 @@ public class DatabaseConnectXSTORE implements AutoCloseable { 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 } } diff --git a/src/main/java/com/example/services/StoreService.java b/src/main/java/com/example/services/StoreService.java index 54c0cbd..b9aa76c 100644 --- a/src/main/java/com/example/services/StoreService.java +++ b/src/main/java/com/example/services/StoreService.java @@ -389,8 +389,7 @@ public class StoreService { @Produces(MediaType.APPLICATION_JSON) public Response getStoreDetails( @PathParam("storeId") Integer storeId, - @QueryParam("dbHost") String dbHost, - @QueryParam("workstationId") Integer workstationId) { + @QueryParam("dbHost") String dbHost) { if (dbHost == null) { return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"dbHost parameter is required\"}").build(); @@ -401,7 +400,7 @@ public class StoreService { } try { - StoreDetails storeDetails = retrieveStoreDetails(dbHost,storeId,workstationId); + StoreDetails storeDetails = retrieveStoreDetails(dbHost,storeId); ObjectMapper objectMapper = new ObjectMapper(); try { @@ -428,144 +427,65 @@ public class StoreService { * @param workstationId the ID of the workstation * @return storeDetails */ - private StoreDetails retrieveStoreDetails(String dbHost, Integer storeId, Integer workstationId) { + 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")) { - // 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"; + // 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(replicationQuery); - try (PreparedStatement storeStatement = databaseConnection.getConnection().prepareStatement(replicationQuery); - ResultSet storeReplicationResultSet = storeStatement.executeQuery()) { - - if (storeReplicationResultSet.next()) { - StoreReplication storeReplication = mapResultSetToStoreReplication(storeReplicationResultSet); - storeDetails.setReplication(storeReplication); - } else { - // Adjust to the desired behavior if no results are found - } - } + 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; - // opening transation section - String openingTransactionQuery = "SELECT"+ - " COUNT(*) AS counter,"+ - " MIN(tt.END_DATETIME) AS minDate,"+ - " MAX(tt.END_DATETIME) AS maxDate"+ - " FROM"+ - " trn_trans tt"+ - " WHERE"+ - " tt.BUSINESS_DATE = ("+ - " SELECT"+ - " MAX(tt_bdate.BUSINESS_DATE) as bd"+ - " FROM"+ - " trn_trans tt_bdate"+ - " WHERE"+ - " tt_bdate.trans_TYPCODE = 'WORKSTATION_OPEN'"+ - " AND tt_bdate.TRANS_STATCODE = 'COMPLETE'"+ - " )"+ - " AND tt.trans_TYPCODE = 'WORKSTATION_OPEN'"+ - " AND tt.TRANS_STATCODE = 'COMPLETE'" ; + 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"); - logger.info(openingTransactionQuery); - try (PreparedStatement storeStatement = databaseConnection.getConnection().prepareStatement(openingTransactionQuery); - ResultSet openingTransactionResultSet = storeStatement.executeQuery()) { - - if (openingTransactionResultSet.next()) { - XstoreTransaction openingTransaction = mapResultSetToXstoreOpeningTransaction(openingTransactionResultSet); - storeDetails.setOpeningTransaction(openingTransaction); - } else { - // Adjust to the desired behavior if no results are found - } - } + StorePos pos = new StorePos(); - // Closing transation section - String closingTransactionQuery = "SELECT"+ - " COUNT(*) AS counter,"+ - " MIN(tt.END_DATETIME) AS minDate,"+ - " MAX(tt.END_DATETIME) AS maxDate"+ - " FROM"+ - " trn_trans tt"+ - " WHERE"+ - " tt.BUSINESS_DATE = ("+ - " SELECT"+ - " MAX(tt_bdate.BUSINESS_DATE)"+ - " FROM"+ - " trn_trans tt_bdate"+ - " WHERE"+ - " tt_bdate.trans_TYPCODE = 'WORKSTATION_OPEN'"+ - " AND tt_bdate.TRANS_STATCODE = 'COMPLETE'"+ - " )"+ - " AND tt.trans_TYPCODE = 'WORKSTATION_CLOSE'"+ - " AND tt.TRANS_STATCODE = 'COMPLETE'"; - - logger.info(closingTransactionQuery); - try (PreparedStatement storeStatement = databaseConnection.getConnection().prepareStatement(closingTransactionQuery); - ResultSet closingTransactionResultSet = storeStatement.executeQuery()) { - - if (closingTransactionResultSet.next()) { - XstoreTransaction closingTransaction = mapResultSetToXstoreClosingTransaction(closingTransactionResultSet); - storeDetails.setClosingTransaction(closingTransaction); - } else { - // Adjust to the desired behavior if no results are found - } - } + // 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); - // sale transation section - String saleTransactionQuery = "SELECT"+ - " COUNT(*) AS counter,"+ - " MIN(tt.END_DATETIME) AS minDate,"+ - " MAX(tt.END_DATETIME) AS maxDate"+ - " FROM"+ - " trn_trans tt"+ - " WHERE"+ - " tt.BUSINESS_DATE = ("+ - " SELECT"+ - " MAX(tt_bdate.BUSINESS_DATE)"+ - " FROM"+ - " trn_trans tt_bdate"+ - " WHERE"+ - " tt_bdate.trans_TYPCODE = 'WORKSTATION_OPEN'"+ - " AND tt_bdate.TRANS_STATCODE = 'COMPLETE'"+ - " )"+ - " AND tt.trans_TYPCODE = 'RETAIL_SALE'"+ - " AND tt.TRANS_STATCODE = 'COMPLETE'"; - - logger.info(saleTransactionQuery); - try (PreparedStatement storeStatement = databaseConnection.getConnection().prepareStatement(saleTransactionQuery); - ResultSet saleTransactionResultSet = storeStatement.executeQuery()) { - - if (saleTransactionResultSet.next()) { - XstoreTransaction saleTransaction = mapResultSetToXstoreSaleTransaction(saleTransactionResultSet); - storeDetails.setSaleTransaction(saleTransaction); - } else { - // Adjust to the desired behavior if no results are found - } - } - - // version section - String versionQuery = "SELECT * FROM ( " + - " SELECT CUSTOMER,CUSTOMER_SCHEMA_VERSION,CUSTOMER_SCHEMA_DATE" + - " FROM dtv.CTL_VERSION_HISTORY" + - " WHERE organization_id = 1 AND customer IS NOT NULL" + - " ORDER BY seq DESC" + - " ) " + - " WHERE ROWNUM = 1"; - - logger.info(versionQuery); - try (PreparedStatement versionStatement = databaseConnection.getConnection().prepareStatement(versionQuery)) { - try (ResultSet versionResultSet = versionStatement.executeQuery()) { - if (versionResultSet.next()) { - storeDetails.setXstoreVersion(versionResultSet.getString("CUSTOMER_SCHEMA_VERSION")); - storeDetails.setXstoreVersionDate(versionResultSet.getDate("CUSTOMER_SCHEMA_DATE")); - storeDetails.setXstoreVersionCustomer(versionResultSet.getString("CUSTOMER")); - } else { - // Adjust to the desired behavior if no results are found + // 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 + } + } */ } } } @@ -574,9 +494,9 @@ public class StoreService { // Handle exceptions correctly in a production environment } - try (DatabaseConnectDOTSOFT databaseConnection = new DatabaseConnectDOTSOFT("com02")) { - // Store section - String storeQuery = "SELECT st.id_structure," + + 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," + @@ -600,7 +520,7 @@ public class StoreService { " WHERE st.id_structure = ?"; logger.info(storeQuery); - try (PreparedStatement storeStatement = databaseConnection.getConnection().prepareStatement(storeQuery)) { + try (PreparedStatement storeStatement = databaseConnectionDS.getConnection().prepareStatement(storeQuery)) { storeStatement.setInt(1, storeId); // Set the value of the parameter try (ResultSet storeResultSet = storeStatement.executeQuery()) { @@ -614,37 +534,170 @@ public class StoreService { } // Transaction section - String transactionQuery = "SELECT COUNT(*) as backOfficeTransactions, " + - " MIN(cf.fdate_integration) AS minBackOfficeTransactionDate, " + - " MAX(cf.fdate_integration) AS maxBackOfficeTransactionDate, " + - " TRUNC(MAX(cf.fdate)) AS backOfficeBusinessDate " + - "FROM com02.client_facture cf " + - "WHERE cf.id_structure = ? " + - "AND TRUNC(cf.fdate_integration) = TRUNC(SYSDATE) " + //TODO : changer la date - "AND cf.version_info = 'XSTORE'"; - - logger.info(transactionQuery); - try (PreparedStatement transactionStatement = databaseConnection.getConnection().prepareStatement(transactionQuery)) { - transactionStatement.setInt(1, storeId); // Set the value of the parameter + 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 transactionResultSet = transactionStatement.executeQuery()) { - if (transactionResultSet.next()) { - BackOfficeTransaction storetransaction = mapResultSetToBackOfficetransaction(transactionResultSet); - storeDetails.setTransaction(storetransaction); - } else { - // Adjust to the desired behavior if no results are found + 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"); @@ -659,31 +712,15 @@ public class StoreService { return new Store(id_structure, nom, telephone, photoLink, enseigne, pays, caisses, adresse, date_migration); } - private StoreReplication mapResultSetToStoreReplication(ResultSet resultSet) throws SQLException { + private PosReplication mapResultSetToPosReplication(ResultSet resultSet) throws SQLException { int pendingReplications = resultSet.getInt("pendingReplications"); Date minPendingReplicationDate = resultSet.getDate("minPendingReplicationDate"); Date maxPendingReplicationDate = resultSet.getDate("maxPendingReplicationDate"); - return new StoreReplication(pendingReplications, minPendingReplicationDate, maxPendingReplicationDate); + return new PosReplication(pendingReplications, minPendingReplicationDate, maxPendingReplicationDate); } - private XstoreTransaction mapResultSetToXstoreOpeningTransaction(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 XstoreTransaction mapResultSetToXstoreClosingTransaction(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 XstoreTransaction mapResultSetToXstoreSaleTransaction(ResultSet resultSet) throws SQLException { + private XstoreTransaction mapResultSetToSaleTransaction(ResultSet resultSet) throws SQLException { int count = resultSet.getInt("counter"); Date minDate = resultSet.getDate("minDate"); Date maxDate = resultSet.getDate("maxDate"); @@ -691,13 +728,12 @@ public class StoreService { return new XstoreTransaction(count, minDate, maxDate); } - private BackOfficeTransaction mapResultSetToBackOfficetransaction(ResultSet resultSet) throws SQLException { + private BackOfficeTransaction mapResultSetToBoTransaction(ResultSet resultSet) throws SQLException { int backofficeTransactions = resultSet.getInt("backOfficeTransactions"); Date minBackofficeTransactionDate = resultSet.getDate("minBackOfficeTransactionDate"); Date maxBackofficeTransactionDate = resultSet.getDate("maxBackOfficeTransactionDate"); - Date backOfficeBusinessDate = resultSet.getDate("backOfficeBusinessDate"); - return new BackOfficeTransaction(backofficeTransactions, minBackofficeTransactionDate, maxBackofficeTransactionDate, backOfficeBusinessDate); + return new BackOfficeTransaction(backofficeTransactions, minBackofficeTransactionDate, maxBackofficeTransactionDate); } private StoreVersion mapResultSetToStoreVersion(ResultSet resultSet) throws SQLException { diff --git a/src/main/java/com/example/services/store/BackOfficeTransaction.java b/src/main/java/com/example/services/store/BackOfficeTransaction.java index 041f32a..74682ad 100644 --- a/src/main/java/com/example/services/store/BackOfficeTransaction.java +++ b/src/main/java/com/example/services/store/BackOfficeTransaction.java @@ -7,7 +7,6 @@ public class BackOfficeTransaction { private int backOfficeTransactions; private Date minBackOfficeTransactionDate; private Date maxBackOfficeTransactionDate; - private Date backOfficeBusinessDate; // Default constructor @@ -16,11 +15,10 @@ public class BackOfficeTransaction { } // Constructor with parameters - public BackOfficeTransaction(int backOfficeTransactions, Date minbackOfficeTransactionDate, Date maxbackOfficeTransactionDate, Date backOfficeBusinessDate) { + public BackOfficeTransaction(int backOfficeTransactions, Date minbackOfficeTransactionDate, Date maxbackOfficeTransactionDate) { this.backOfficeTransactions = backOfficeTransactions; this.minBackOfficeTransactionDate = minbackOfficeTransactionDate; this.maxBackOfficeTransactionDate = maxbackOfficeTransactionDate; - this.backOfficeBusinessDate = backOfficeBusinessDate; } // Getters et setters @@ -57,18 +55,4 @@ public class BackOfficeTransaction { public void setMaxBackOfficeTransactionDate(Date maxBackOfficeTransactionDate) { this.maxBackOfficeTransactionDate = maxBackOfficeTransactionDate; } - - public String getBackOfficeBusinessDate() { - if (backOfficeBusinessDate != null) { - SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); - return dateFormat.format(backOfficeBusinessDate); - } else { - return ""; - } - } - - - public void setBackOfficeBusinessDate(Date backOfficeBusinessDate) { - this.backOfficeBusinessDate = backOfficeBusinessDate; - } } diff --git a/src/main/java/com/example/services/store/StoreReplication.java b/src/main/java/com/example/services/store/PosReplication.java similarity index 86% rename from src/main/java/com/example/services/store/StoreReplication.java rename to src/main/java/com/example/services/store/PosReplication.java index 7fe3011..d72d23a 100644 --- a/src/main/java/com/example/services/store/StoreReplication.java +++ b/src/main/java/com/example/services/store/PosReplication.java @@ -3,18 +3,18 @@ package com.example.services.store; import java.sql.Date; import java.text.SimpleDateFormat; -public class StoreReplication { +public class PosReplication { private int pendingReplications; private Date minPendingReplicationDate; private Date maxPendingReplicationDate; - // Constructeur par défaut - public StoreReplication() { + // Default constructor + public PosReplication() { // Default constructor required for JSON deserialization } - // Constructeur avec paramètres - public StoreReplication(int pendingReplications, Date minPendingReplicationDate, Date maxPendingReplicationDate) { + // Constructor with parameters + public PosReplication(int pendingReplications, Date minPendingReplicationDate, Date maxPendingReplicationDate) { this.pendingReplications = pendingReplications; this.minPendingReplicationDate = minPendingReplicationDate; this.maxPendingReplicationDate = maxPendingReplicationDate; diff --git a/src/main/java/com/example/services/store/StoreDetails.java b/src/main/java/com/example/services/store/StoreDetails.java index 7fca3ae..7229881 100644 --- a/src/main/java/com/example/services/store/StoreDetails.java +++ b/src/main/java/com/example/services/store/StoreDetails.java @@ -1,34 +1,20 @@ package com.example.services.store; -import java.sql.Date; -import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; public class StoreDetails { private Store store; - private StoreReplication replication; - private BackOfficeTransaction transaction; - private XstoreTransaction openingTransaction; - private XstoreTransaction closingTransaction; - private XstoreTransaction saleTransaction; - private String xstoreVersion; - private Date xstoreVersionDate; - private String xstoreVersionCustomer; - - + 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, StoreReplication replication, BackOfficeTransaction transaction, XstoreTransaction openingTransaction, XstoreTransaction closingTransaction, XstoreTransaction saleTransaction, String xstoreVersion, Date xstoreVersionDate, String xstoreVersionCustomer) { + public StoreDetails(Store store, List pos) { this.store = store; - this.replication = replication; - this.transaction = transaction; - this.openingTransaction = openingTransaction; - this.closingTransaction = closingTransaction; - this.saleTransaction = saleTransaction; - this.xstoreVersion = xstoreVersion; - this.xstoreVersionDate = xstoreVersionDate; - this.xstoreVersionCustomer = xstoreVersionCustomer; + this.pos = pos != null ? pos : new ArrayList<>(); } public Store getStore() { @@ -39,73 +25,12 @@ public class StoreDetails { this.store = store; } - public StoreReplication getReplication() { - return replication; + public List getPos() { + return pos; } - public void setReplication(StoreReplication replication) { - this.replication = replication; - } - - public BackOfficeTransaction getTransaction() { - return transaction; - } - - public void setTransaction(BackOfficeTransaction transaction) { - this.transaction = transaction; - } - - public XstoreTransaction getOpeningTransaction() { - return openingTransaction; - } - - public void setOpeningTransaction(XstoreTransaction openingTransaction) { - this.openingTransaction = openingTransaction; - } - - public XstoreTransaction getClosingTransaction() { - return closingTransaction; - } - - public void setClosingTransaction(XstoreTransaction closingTransaction) { - this.closingTransaction = closingTransaction; - } - - public XstoreTransaction getSaleTransaction() { - return saleTransaction; - } - - public void setSaleTransaction(XstoreTransaction saleTransaction) { - this.saleTransaction = saleTransaction; - } - - public String getXstoreVersion() { - return xstoreVersion; - } - - public void setXstoreVersion(String xstoreVersion) { - this.xstoreVersion = xstoreVersion; - } - - public String getXstoreVersionDate() { - if (xstoreVersionDate != null) { - SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); - return dateFormat.format(xstoreVersionDate); - } else { - return ""; - } - } - - public void setXstoreVersionDate(Date xstoreVersionDate) { - this.xstoreVersionDate = xstoreVersionDate; - } - - public String getXstoreVersionCustomer() { - return xstoreVersionCustomer; - } - - public void setXstoreVersionCustomer(String xstoreVersionCustomer) { - this.xstoreVersionCustomer = xstoreVersionCustomer; + 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); + } +} From 869328a33f8a55f59471344440a42bdea0a584f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9rik=20BENOIST?= Date: Thu, 28 Dec 2023 23:11:04 +0100 Subject: [PATCH 14/16] fix: xstore sqlquery add xadmin log request --- .../services/DatabaseConnectXADMIN.java | 61 ++++++++ .../com/example/services/DatabaseService.java | 52 ------- .../com/example/services/StoreService.java | 147 ++++++++++++++++++ .../com/example/services/XadminService.java | 127 +++++++++++++++ .../application/XadminApplicationLog.java | 87 +++++++++++ src/main/resources/db.properties | 6 +- 6 files changed, 427 insertions(+), 53 deletions(-) create mode 100644 src/main/java/com/example/services/DatabaseConnectXADMIN.java delete mode 100644 src/main/java/com/example/services/DatabaseService.java create mode 100644 src/main/java/com/example/services/XadminService.java create mode 100644 src/main/java/com/example/services/xadmin/application/XadminApplicationLog.java 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/DatabaseService.java b/src/main/java/com/example/services/DatabaseService.java deleted file mode 100644 index 9fbbf05..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 (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost, "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/StoreService.java b/src/main/java/com/example/services/StoreService.java index b9aa76c..6a4d800 100644 --- a/src/main/java/com/example/services/StoreService.java +++ b/src/main/java/com/example/services/StoreService.java @@ -1,6 +1,7 @@ package com.example.services; import com.example.services.store.*; +import com.example.services.xadmin.application.*; import javax.ws.rs.GET; import javax.ws.rs.Path; @@ -18,7 +19,10 @@ import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Calendar; import java.util.Collections; import java.util.List; import java.util.concurrent.locks.Lock; @@ -361,6 +365,149 @@ public class StoreService { } } + @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); // Définir le timeout à 5 secondes + + try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost,"dtv")) { + SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd"); + java.util.Date startDate; + Integer timezoneOffset = 0; + + try { + startDate = formatter.parse(logDate); + Calendar cal = Calendar.getInstance(); + cal.setTime(startDate); + cal.add(Calendar.DATE, -9); + java.util.Date endDate = cal.getTime(); + + String queryTZ = "SELECT timezone_offset " + + "FROM (" + + " SELECT EXTRACT(HOUR FROM CAST(tt.BEGIN_DATETIME AS TIMESTAMP)) - EXTRACT(HOUR FROM CAST(tt.create_date AS TIMESTAMP)) AS timezone_offset " + + " FROM dtv.trn_trans tt " + + " WHERE" + + " tt.ORGANIZATION_ID = 1" + + " AND tt.RTL_LOC_ID = ?" + + " AND tt.BUSINESS_DATE = TRUNC(?)" + + " AND tt.trans_TYPCODE = 'SYSTEM_OPEN'" + + " AND tt.TRANS_STATCODE = 'COMPLETE'" + + ") " + + "WHERE ROWNUM = 1"; + + while (startDate.compareTo(endDate) >= 0) { + try (PreparedStatement pst = databaseConnection.getConnection().prepareStatement(queryTZ)) { + pst.setInt(1, storeId); + pst.setDate(2, new java.sql.Date(startDate.getTime())); + + try (ResultSet rs = pst.executeQuery()) { + if (rs.next()) { + Integer tempTimezoneOffset = rs.getInt("timezone_offset"); + if (tempTimezoneOffset != null) { + timezoneOffset = tempTimezoneOffset; + break; + } + } + } + } + + cal.setTime(startDate); + cal.add(Calendar.DATE, -1); + startDate = (java.util.Date) cal.getTime(); + } + } catch (ParseException e) { + e.printStackTrace(); + } + + String query = "SELECT cel.CREATE_DATE + INTERVAL '1' HOUR * ? as CREATE_DATE, " + + "cel.CREATE_USER_ID, " + + "cel.BUSINESS_DATE, " + + "cel.RTL_LOC_ID, " + + "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' " + + "ELSE cel.LOGGER_CATEGORY END as LOGGER_CATEGORY " + + "FROM dtv.CTL_EVENT_LOG cel " + + "WHERE cel.CREATE_DATE BETWEEN TO_DATE( ?, 'rrrrmmdd') AND TO_DATE( ?, 'rrrrmmdd hh24:mi:ss') " + + "AND cel.ORGANIZATION_ID = 1 " + + "AND cel.RTL_LOC_ID = ? " + + "AND cel.THREAD_NAME IS NOT NULL " + + "ORDER BY cel.CREATE_DATE DESC"; + + try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query)) { + statement.setInt(1, timezoneOffset); + statement.setString(2, logDate); + statement.setString(3, logDate + " 23:59:59"); + statement.setInt(4, storeId); + + ResultSet resultSet = statement.executeQuery(); + + List storeLogList = new ArrayList<>(); + + while (resultSet.next()) { + XadminApplicationLog 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 XadminApplicationLog mapResultSetToStoreLog(ResultSet resultSet) throws SQLException { + XadminApplicationLog xadminapplicationlog = new XadminApplicationLog(); + + xadminapplicationlog.setCreateDate(resultSet.getDate("CREATE_DATE")); + xadminapplicationlog.setCreateUserId(resultSet.getString("CREATE_USER_ID")); + xadminapplicationlog.setBusinessDate(resultSet.getDate("BUSINESS_DATE")); + xadminapplicationlog.setRtlLocId(resultSet.getInt("RTL_LOC_ID")); + xadminapplicationlog.setWkstnId(resultSet.getInt("WKSTN_ID")); + xadminapplicationlog.setLogLevel(resultSet.getString("LOG_LEVEL")); + xadminapplicationlog.setThreadName(resultSet.getString("THREAD_NAME")); + xadminapplicationlog.setLogMessage(resultSet.getString("LOG_MESSAGE")); + xadminapplicationlog.setLoggerCategory(resultSet.getString("LOGGER_CATEGORY")); + + return xadminapplicationlog; + } + /** * Maps a ResultSet to a store object. * 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..43e6328 --- /dev/null +++ b/src/main/java/com/example/services/XadminService.java @@ -0,0 +1,127 @@ +package com.example.services; + +import com.example.services.xadmin.application.XadminApplicationLog; + +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; +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.text.ParseException; +import java.text.SimpleDateFormat; +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("/application/log/{storeId}") + @Produces(MediaType.APPLICATION_JSON) + public Response getApplicationLogByStoreId(@PathParam("storeId") Integer storeId, + @QueryParam("WkstnId") Integer wkstnId, + @QueryParam("BeginDate") String beginDate, + @QueryParam("EndDate") String endDate, + @QueryParam("SearchText") String searchText) { + if (storeId == null) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"storeId parameter is required\"}").build(); + } + + if (beginDate == null || endDate == null) { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"BeginDate and EndDate parameters are required\"}").build(); + } + + DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes + + try (DatabaseConnectXADMIN databaseConnection = new DatabaseConnectXADMIN("dtv")) { + String query = + "SELECT cel.BUSINESS_DATE, " + + "cel.CREATE_DATE, " + + "cel.CREATE_USER_ID, " + + "cel.RTL_LOC_ID, " + + "cel.WKSTN_ID, " + + "cel.LOG_LEVEL, " + + "cel.THREAD_NAME, " + + "cel.LOG_MESSAGE " + + "FROM dtv.CTL_EVENT_LOG cel " + + "WHERE cel.CREATE_DATE BETWEEN ? AND TRUNC(? + 1) " + + "AND cel.ORGANIZATION_ID = 1 " + + "AND cel.RTL_LOC_ID = ? " + + (wkstnId != null ? "AND cel.WKSTN_ID = ? " : "") + + "ORDER BY cel.CREATE_DATE"; + + logger.info(query); + + try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query)) { + SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); + java.sql.Date parsedBeginDate = null; + java.sql.Date parsedEndDate = null; + + try { + parsedBeginDate = new java.sql.Date(format.parse(beginDate).getTime()); + parsedEndDate = new java.sql.Date(format.parse(endDate).getTime()); + } catch (ParseException e) { + e.printStackTrace(); + } + + statement.setDate(1, parsedBeginDate); + statement.setDate(2, parsedEndDate); + statement.setInt(3, storeId); + + if(wkstnId != null) { + statement.setInt(4, wkstnId); + } + + try (ResultSet resultSet = statement.executeQuery()) { + List xadminApplicationLogList = new ArrayList<>(); + + while (resultSet.next()) { + XadminApplicationLog xadminApplicationLog = mapResultSetToApplicationLog(resultSet); + xadminApplicationLogList.add(xadminApplicationLog); + } + + ObjectMapper objectMapper = new ObjectMapper(); + String jsonResponse = objectMapper.writeValueAsString(xadminApplicationLogList); + + 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 XadminApplicationLog mapResultSetToApplicationLog(ResultSet resultSet) throws SQLException { + XadminApplicationLog xadminapplicationlog = new XadminApplicationLog(); + + xadminapplicationlog.setBusinessDate(resultSet.getDate("BUSINESS_DATE")); + xadminapplicationlog.setCreateDate(resultSet.getDate("CREATE_DATE")); + xadminapplicationlog.setCreateUserId(resultSet.getString("CREATE_USER_ID")); + xadminapplicationlog.setRtlLocId(resultSet.getInt("RTL_LOC_ID")); + xadminapplicationlog.setWkstnId(resultSet.getInt("WKSTN_ID")); + xadminapplicationlog.setLogLevel(resultSet.getString("LOG_LEVEL")); + xadminapplicationlog.setThreadName(resultSet.getString("THREAD_NAME")); + xadminapplicationlog.setLogMessage(resultSet.getString("LOG_MESSAGE")); + + return xadminapplicationlog; + } +} diff --git a/src/main/java/com/example/services/xadmin/application/XadminApplicationLog.java b/src/main/java/com/example/services/xadmin/application/XadminApplicationLog.java new file mode 100644 index 0000000..1f18c44 --- /dev/null +++ b/src/main/java/com/example/services/xadmin/application/XadminApplicationLog.java @@ -0,0 +1,87 @@ +package com.example.services.xadmin.application; + +import java.util.Date; + +public class XadminApplicationLog { + 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; + + 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; + } +} diff --git a/src/main/resources/db.properties b/src/main/resources/db.properties index 1c8d3b9..e9410c6 100644 --- a/src/main/resources/db.properties +++ b/src/main/resources/db.properties @@ -16,4 +16,8 @@ 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 \ No newline at end of file +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 From 18e73d4700c1921df611ee3287f52172bb75c045 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9rik=20BENOIST?= Date: Fri, 29 Dec 2023 07:54:19 +0100 Subject: [PATCH 15/16] fix: prevent timezoneoffset too large --- .../com/example/services/StoreService.java | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/example/services/StoreService.java b/src/main/java/com/example/services/StoreService.java index 6a4d800..9cff414 100644 --- a/src/main/java/com/example/services/StoreService.java +++ b/src/main/java/com/example/services/StoreService.java @@ -52,7 +52,7 @@ public class StoreService { 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 try (DatabaseConnectDOTSOFT databaseConnection = new DatabaseConnectDOTSOFT("com02")) { String query = "SELECT st.id_structure," + @@ -79,7 +79,6 @@ public class StoreService { " WHERE st.id_structure = ?"; logger.info(query); - try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query)) { statement.setString(1, storeId); @@ -163,7 +162,7 @@ public class StoreService { * @return a list of stores retrieved from the database */ private List retrieveStoresFromDatabase() { - DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes + DriverManager.setLoginTimeout(5); // Set timeout to 5 seconds try (DatabaseConnectDOTSOFT databaseConnection = new DatabaseConnectDOTSOFT("com02")) { String query = "SELECT st.id_structure," + @@ -191,7 +190,6 @@ public class StoreService { " ORDER BY st.id_structure"; logger.info(query); - try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query); ResultSet resultSet = statement.executeQuery()) { @@ -225,7 +223,7 @@ public class StoreService { return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"dbHost parameter is required\"}").build(); } - DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes + DriverManager.setLoginTimeout(5); // Set timeout to 5 seconds try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost,"dtv")) { @@ -234,6 +232,7 @@ public class StoreService { "WHERE organization_id = 1 " + "ORDER BY WKSTN_ID, SEQUENCE_ID"; + logger.info(query); try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query)) { ResultSet resultSet = statement.executeQuery(); @@ -277,7 +276,7 @@ public class StoreService { return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"dbHost parameter is required\"}").build(); } - DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes + 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 " + @@ -285,6 +284,7 @@ public class StoreService { "WHERE organization_id = 1 " + "ORDER BY WKSTN_ID"; + logger.info(query); try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query)) { ResultSet resultSet = statement.executeQuery(); @@ -328,7 +328,7 @@ public class StoreService { return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"dbHost parameter is required\"}").build(); } - DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes + DriverManager.setLoginTimeout(5); // Set timeout to 5 seconds try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost,"dtv")) { @@ -338,6 +338,7 @@ public class StoreService { "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(); @@ -385,7 +386,7 @@ public class StoreService { return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"dbHost parameter is required\"}").build(); } - DriverManager.setLoginTimeout(5); // Définir le timeout à 5 secondes + DriverManager.setLoginTimeout(5); // Set timeout to 5 seconds try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost,"dtv")) { SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd"); @@ -412,6 +413,7 @@ public class StoreService { ") " + "WHERE ROWNUM = 1"; + logger.info(queryTZ); while (startDate.compareTo(endDate) >= 0) { try (PreparedStatement pst = databaseConnection.getConnection().prepareStatement(queryTZ)) { pst.setInt(1, storeId); @@ -435,7 +437,13 @@ public class StoreService { } catch (ParseException e) { e.printStackTrace(); } + + // to prevent timezone offset from being too large + if (Math.abs(timezoneOffset) > 3) { + timezoneOffset = 0; + } + // WHERE cel.CREATE_DATE does not take time zone into account (...+ INTERVAL '1' HOUR * ?) String query = "SELECT cel.CREATE_DATE + INTERVAL '1' HOUR * ? as CREATE_DATE, " + "cel.CREATE_USER_ID, " + "cel.BUSINESS_DATE, " + @@ -460,6 +468,7 @@ public class StoreService { "AND cel.THREAD_NAME IS NOT NULL " + "ORDER BY cel.CREATE_DATE DESC"; + logger.info(query); try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query)) { statement.setInt(1, timezoneOffset); statement.setString(2, logDate); @@ -592,6 +601,7 @@ public class StoreService { "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; From 7649a507aa4be6b23913f7cb08f3ee938c49a6b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9rik=20BENOIST?= Date: Sun, 31 Dec 2023 07:49:27 +0100 Subject: [PATCH 16/16] refactor: xadmin and store logs --- .../com/example/services/StoreService.java | 150 +++++++--------- .../com/example/services/XadminService.java | 163 +++++++++++------- .../XadminLog.java} | 13 +- 3 files changed, 180 insertions(+), 146 deletions(-) rename src/main/java/com/example/services/xadmin/{application/XadminApplicationLog.java => log/XadminLog.java} (87%) diff --git a/src/main/java/com/example/services/StoreService.java b/src/main/java/com/example/services/StoreService.java index 9cff414..26c888a 100644 --- a/src/main/java/com/example/services/StoreService.java +++ b/src/main/java/com/example/services/StoreService.java @@ -1,7 +1,7 @@ package com.example.services; import com.example.services.store.*; -import com.example.services.xadmin.application.*; +import com.example.services.xadmin.log.XadminLog; import javax.ws.rs.GET; import javax.ws.rs.Path; @@ -19,10 +19,7 @@ import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Calendar; import java.util.Collections; import java.util.List; import java.util.concurrent.locks.Lock; @@ -33,7 +30,7 @@ import org.slf4j.LoggerFactory; @Path("/stores") public class StoreService { - private static final Logger logger = LoggerFactory.getLogger(DatabaseConnectDOTSOFT.class); + private static final Logger logger = LoggerFactory.getLogger(StoreService.class); private static List cachedStoreList; private static final Lock cacheLock = new ReentrantLock(); @@ -227,7 +224,7 @@ public class StoreService { 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 " + + 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"; @@ -389,65 +386,26 @@ public class StoreService { DriverManager.setLoginTimeout(5); // Set timeout to 5 seconds try (DatabaseConnectXSTORE databaseConnection = new DatabaseConnectXSTORE(dbHost,"dtv")) { - SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd"); - java.util.Date startDate; - Integer timezoneOffset = 0; - - try { - startDate = formatter.parse(logDate); - Calendar cal = Calendar.getInstance(); - cal.setTime(startDate); - cal.add(Calendar.DATE, -9); - java.util.Date endDate = cal.getTime(); - - String queryTZ = "SELECT timezone_offset " + - "FROM (" + - " SELECT EXTRACT(HOUR FROM CAST(tt.BEGIN_DATETIME AS TIMESTAMP)) - EXTRACT(HOUR FROM CAST(tt.create_date AS TIMESTAMP)) AS timezone_offset " + - " FROM dtv.trn_trans tt " + - " WHERE" + - " tt.ORGANIZATION_ID = 1" + - " AND tt.RTL_LOC_ID = ?" + - " AND tt.BUSINESS_DATE = TRUNC(?)" + - " AND tt.trans_TYPCODE = 'SYSTEM_OPEN'" + - " AND tt.TRANS_STATCODE = 'COMPLETE'" + - ") " + - "WHERE ROWNUM = 1"; - - logger.info(queryTZ); - while (startDate.compareTo(endDate) >= 0) { - try (PreparedStatement pst = databaseConnection.getConnection().prepareStatement(queryTZ)) { - pst.setInt(1, storeId); - pst.setDate(2, new java.sql.Date(startDate.getTime())); - - try (ResultSet rs = pst.executeQuery()) { - if (rs.next()) { - Integer tempTimezoneOffset = rs.getInt("timezone_offset"); - if (tempTimezoneOffset != null) { - timezoneOffset = tempTimezoneOffset; - break; - } - } - } - } - - cal.setTime(startDate); - cal.add(Calendar.DATE, -1); - startDate = (java.util.Date) cal.getTime(); - } - } catch (ParseException e) { - e.printStackTrace(); - } - - // to prevent timezone offset from being too large - if (Math.abs(timezoneOffset) > 3) { - timezoneOffset = 0; - } - - // WHERE cel.CREATE_DATE does not take time zone into account (...+ INTERVAL '1' HOUR * ?) - String query = "SELECT cel.CREATE_DATE + INTERVAL '1' HOUR * ? as CREATE_DATE, " + + 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, "+ + "cel.RTL_LOC_ID || ' - ' || loc.STORE_NAME AS STORE_NAME, " + "cel.WKSTN_ID, " + "cel.LOG_LEVEL, " + "cel.THREAD_NAME, " + @@ -460,27 +418,50 @@ public class StoreService { " 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 " + - "WHERE cel.CREATE_DATE BETWEEN TO_DATE( ?, 'rrrrmmdd') AND TO_DATE( ?, 'rrrrmmdd hh24:mi:ss') " + + "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"; + "ORDER BY cel.CREATE_DATE DESC"; logger.info(query); try (PreparedStatement statement = databaseConnection.getConnection().prepareStatement(query)) { - statement.setInt(1, timezoneOffset); - statement.setString(2, logDate); - statement.setString(3, logDate + " 23:59:59"); - statement.setInt(4, storeId); + 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<>(); + List storeLogList = new ArrayList<>(); while (resultSet.next()) { - XadminApplicationLog storeLog = mapResultSetToStoreLog(resultSet); + XadminLog storeLog = mapResultSetToStoreLog(resultSet); storeLogList.add(storeLog); } @@ -501,20 +482,21 @@ public class StoreService { } } - public XadminApplicationLog mapResultSetToStoreLog(ResultSet resultSet) throws SQLException { - XadminApplicationLog xadminapplicationlog = new XadminApplicationLog(); + public XadminLog mapResultSetToStoreLog(ResultSet resultSet) throws SQLException { + XadminLog xadminlog = new XadminLog(); - xadminapplicationlog.setCreateDate(resultSet.getDate("CREATE_DATE")); - xadminapplicationlog.setCreateUserId(resultSet.getString("CREATE_USER_ID")); - xadminapplicationlog.setBusinessDate(resultSet.getDate("BUSINESS_DATE")); - xadminapplicationlog.setRtlLocId(resultSet.getInt("RTL_LOC_ID")); - xadminapplicationlog.setWkstnId(resultSet.getInt("WKSTN_ID")); - xadminapplicationlog.setLogLevel(resultSet.getString("LOG_LEVEL")); - xadminapplicationlog.setThreadName(resultSet.getString("THREAD_NAME")); - xadminapplicationlog.setLogMessage(resultSet.getString("LOG_MESSAGE")); - xadminapplicationlog.setLoggerCategory(resultSet.getString("LOGGER_CATEGORY")); + 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 xadminapplicationlog; + return xadminlog; } /** diff --git a/src/main/java/com/example/services/XadminService.java b/src/main/java/com/example/services/XadminService.java index 43e6328..049eb98 100644 --- a/src/main/java/com/example/services/XadminService.java +++ b/src/main/java/com/example/services/XadminService.java @@ -1,10 +1,9 @@ package com.example.services; -import com.example.services.xadmin.application.XadminApplicationLog; +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; @@ -17,8 +16,6 @@ import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; @@ -30,72 +27,116 @@ public class XadminService { private static final Logger logger = LoggerFactory.getLogger(DatabaseConnectXADMIN.class); @GET - @Path("/application/log/{storeId}") + @Path("/log") @Produces(MediaType.APPLICATION_JSON) - public Response getApplicationLogByStoreId(@PathParam("storeId") Integer storeId, - @QueryParam("WkstnId") Integer wkstnId, - @QueryParam("BeginDate") String beginDate, - @QueryParam("EndDate") String endDate, - @QueryParam("SearchText") String searchText) { - if (storeId == null) { - return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\":\"storeId parameter is required\"}").build(); - } - + 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); // Définir le timeout à 5 secondes + DriverManager.setLoginTimeout(5); // Set timeout to 5 seconds try (DatabaseConnectXADMIN databaseConnection = new DatabaseConnectXADMIN("dtv")) { - String query = - "SELECT cel.BUSINESS_DATE, " + - "cel.CREATE_DATE, " + - "cel.CREATE_USER_ID, " + - "cel.RTL_LOC_ID, " + - "cel.WKSTN_ID, " + - "cel.LOG_LEVEL, " + - "cel.THREAD_NAME, " + - "cel.LOG_MESSAGE " + - "FROM dtv.CTL_EVENT_LOG cel " + - "WHERE cel.CREATE_DATE BETWEEN ? AND TRUNC(? + 1) " + - "AND cel.ORGANIZATION_ID = 1 " + - "AND cel.RTL_LOC_ID = ? " + - (wkstnId != null ? "AND cel.WKSTN_ID = ? " : "") + - "ORDER BY cel.CREATE_DATE"; + 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)) { - SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); - java.sql.Date parsedBeginDate = null; - java.sql.Date parsedEndDate = null; + statement.setString(1, beginDate); + statement.setString(2, endDate + " 23:59:59"); + statement.setString(3, beginDate); + statement.setString(4, endDate + " 23:59:59"); - try { - parsedBeginDate = new java.sql.Date(format.parse(beginDate).getTime()); - parsedEndDate = new java.sql.Date(format.parse(endDate).getTime()); - } catch (ParseException e) { - e.printStackTrace(); - } + Integer indexParam = 5; - statement.setDate(1, parsedBeginDate); - statement.setDate(2, parsedEndDate); - statement.setInt(3, storeId); + if (storeId != null) { + statement.setInt( indexParam++, storeId); + } - if(wkstnId != null) { - statement.setInt(4, wkstnId); + if (wkstnId != null) { + statement.setInt(indexParam++,wkstnId); + } + + if(searchText != null) { + statement.setString(indexParam++, "%" + searchText.toLowerCase() + "%"); } try (ResultSet resultSet = statement.executeQuery()) { - List xadminApplicationLogList = new ArrayList<>(); + List xadminLogList = new ArrayList<>(); while (resultSet.next()) { - XadminApplicationLog xadminApplicationLog = mapResultSetToApplicationLog(resultSet); - xadminApplicationLogList.add(xadminApplicationLog); + XadminLog xadminLog = mapResultSetToXadminLog(resultSet); + xadminLogList.add(xadminLog); } ObjectMapper objectMapper = new ObjectMapper(); - String jsonResponse = objectMapper.writeValueAsString(xadminApplicationLogList); + String jsonResponse = objectMapper.writeValueAsString(xadminLogList); return Response.ok(jsonResponse).build(); } @@ -110,18 +151,20 @@ public class XadminService { } } - public XadminApplicationLog mapResultSetToApplicationLog(ResultSet resultSet) throws SQLException { - XadminApplicationLog xadminapplicationlog = new XadminApplicationLog(); + public XadminLog mapResultSetToXadminLog(ResultSet resultSet) throws SQLException { + XadminLog xadminlog = new XadminLog(); - xadminapplicationlog.setBusinessDate(resultSet.getDate("BUSINESS_DATE")); - xadminapplicationlog.setCreateDate(resultSet.getDate("CREATE_DATE")); - xadminapplicationlog.setCreateUserId(resultSet.getString("CREATE_USER_ID")); - xadminapplicationlog.setRtlLocId(resultSet.getInt("RTL_LOC_ID")); - xadminapplicationlog.setWkstnId(resultSet.getInt("WKSTN_ID")); - xadminapplicationlog.setLogLevel(resultSet.getString("LOG_LEVEL")); - xadminapplicationlog.setThreadName(resultSet.getString("THREAD_NAME")); - xadminapplicationlog.setLogMessage(resultSet.getString("LOG_MESSAGE")); + 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 xadminapplicationlog; + return xadminlog; } } diff --git a/src/main/java/com/example/services/xadmin/application/XadminApplicationLog.java b/src/main/java/com/example/services/xadmin/log/XadminLog.java similarity index 87% rename from src/main/java/com/example/services/xadmin/application/XadminApplicationLog.java rename to src/main/java/com/example/services/xadmin/log/XadminLog.java index 1f18c44..20ba196 100644 --- a/src/main/java/com/example/services/xadmin/application/XadminApplicationLog.java +++ b/src/main/java/com/example/services/xadmin/log/XadminLog.java @@ -1,8 +1,8 @@ -package com.example.services.xadmin.application; +package com.example.services.xadmin.log; import java.util.Date; -public class XadminApplicationLog { +public class XadminLog { private Date businessDate; private Date createDate; private String createUserId; @@ -12,6 +12,7 @@ public class XadminApplicationLog { private String threadName; private String logMessage; private String loggerCategory; + private String storeName; public Date getBusinessDate() { return businessDate; @@ -84,4 +85,12 @@ public class XadminApplicationLog { public void setLoggerCategory(String loggerCategory) { this.loggerCategory = loggerCategory; } + + public String getStoreName() { + return storeName; + } + + public void setStoreName(String storeName) { + this.storeName = storeName; + } }