diff --git a/scripts/create-dev.sql b/scripts/create-dev.sql index 95b593e70aa96a3926a5193027bd9ace4fdb228c..f73ce2f0c93d04e66b2a6f8d4b347128fe8f45a5 100644 --- a/scripts/create-dev.sql +++ b/scripts/create-dev.sql @@ -1,5 +1,7 @@ +DROP TABLE IF EXISTS stocks; DROP TABLE IF EXISTS registry; DROP TABLE IF EXISTS transaction_types; +DROP TABLE IF EXISTS accounts; DROP TABLE IF EXISTS items; DROP TABLE IF EXISTS categories; @@ -13,23 +15,37 @@ CREATE TABLE items ( name TEXT NOT NULL, price REAL NOT NULL, subscriberPrice REAL NOT NULL, - category INTEGER NOT NULL, - FOREIGN KEY (category) REFERENCES categories (id) + category INTEGER NOT NULL, + FOREIGN KEY (category) REFERENCES categories (id) ); CREATE TABLE transaction_types ( id INTEGER PRIMARY KEY, - name TEXT NOT NULL + name TEXT NOT NULL +); + +CREATE TABLE accounts ( + id INTEGER PRIMARY KEY, + num INTEGER NOT NULL, + name TEXT NOT NULL ); CREATE TABLE registry ( id INTEGER PRIMARY KEY, - dt INTEGER NOT NULL, - type INTEGER NOT NULL, - description TEXT NOT NULL, - debit REAL, - credit REAL, - remarks TEXT + dt INTEGER NOT NULL, + type INTEGER NOT NULL, + account_id INTEGER NOT NULL, + debit REAL, + credit REAL, + remarks TEXT, + FOREIGN KEY (account_id) REFERENCES accounts (id) +); + +CREATE TABLE stocks ( + id INTEGER PRIMARY KEY, + item INTEGER NOT NULL, + quantity INTEGER NOT NULL, + FOREIGN KEY (item) REFERENCES items (ref) ); INSERT INTO categories (id, name) @@ -46,16 +62,32 @@ INSERT INTO transaction_types (id, name) (2, "REGLEMENT"), (3, "VENTE"), (4, "ENCAISSEMENT"); - -INSERT INTO registry (id, dt, type, description, debit, credit, remarks) - VALUES (1, datetime("2021-09-21 01:00:00"), 4, "101 Capital", null, 500.0, null), - (2, datetime("2021-09-21 01:30:00"), 4, "512 Banque", 500.0, null, null), - (3, datetime("2021-09-21 02:00:00"), 1, "601 Achat", 152.0, null, "Facture d'achat"), - (4, datetime("2021-09-21 02:30:00"), 1, "401 Fournisseur", null, 152.0, "Facture Achat = dette au fournisseur"), - (5, datetime("2021-09-21 03:00:00"), 2, "401 Fournisseur", 152.0, null, "Règlement de la facture d'achat"), - (6, datetime("2021-09-21 03:30:00"), 2, "512 Banque", null, 152.0, "Règlement de la facture d'achat"), - (7, datetime("2021-09-21 04:00:00"), 3, "706 Vente", null, 60.0, "Vente"), - (8, datetime("2021-09-21 04:30:00"), 3, "445 TVA Collectée", null, 12.0, null), - (9, datetime("2021-09-21 05:00:00"), 3, "411 Client", 72.0, null, "Facture vente = Dette client"), - (10, datetime("2021-09-21 05:30:00"), 4, "411 Client", null, 72.0, "Encaissement de l'argent"), - (11, datetime("2021-09-21 06:00:00"), 4, "512 Banque", 72.0, null, "= La dette du client est soldée"); \ No newline at end of file + + +INSERT INTO accounts (id, num, name) + VALUES(1, 101, "Capital"), + (2, 512, "Banque"), + (3, 601, "Achat"), + (4, 401, "Fournisseur"), + (5, 706, "Vente"), + (6, 445, "TVA Collectée"), + (7, 411, "Client"); + + +INSERT INTO registry (id, dt, type, account_id, debit, credit, remarks) + VALUES (1, datetime("2021-09-21 01:00:00"), 4, 1, null, 500.0, null), + (2, datetime("2021-09-21 01:30:00"), 4, 2, 500.0, null, null), + (3, datetime("2021-09-21 02:00:00"), 1, 3, 152.0, null, "Facture d'achat"), + (4, datetime("2021-09-21 02:30:00"), 1, 4, null, 152.0, "Facture Achat = dette au fournisseur"), + (5, datetime("2021-09-21 03:00:00"), 2, 4, 152.0, null, "Règlement de la facture d'achat"), + (6, datetime("2021-09-21 03:30:00"), 2, 2, null, 152.0, "Règlement de la facture d'achat"), + (7, datetime("2021-09-21 04:00:00"), 3, 5, null, 60.0, "Vente"), + (8, datetime("2021-09-21 04:30:00"), 3, 6, null, 12.0, null), + (9, datetime("2021-09-21 05:00:00"), 3, 7, 72.0, null, "Facture vente = Dette client"), + (10, datetime("2021-09-21 05:30:00"), 4, 7, null, 72.0, "Encaissement de l'argent"), + (11, datetime("2021-09-21 06:00:00"), 4, 2, 72.0, null, "= La dette du client est soldée"); + +INSERT INTO stocks (id, item, quantity) + VALUES(1, 1, 25), + (2, 2, 12), + (3, 3, 50); \ No newline at end of file diff --git a/scripts/generate-dev.sh b/scripts/generate-dev.sh old mode 100644 new mode 100755 diff --git a/src/main/java/fr/unistra/sil/erp/back/Config.java b/src/main/java/fr/unistra/sil/erp/back/Config.java index 0fa1b11ac08bda6294b61ed854ee9c844ff4b85e..dd7c0537e53030b395dbeb0d048a3ac6c3cfcb5a 100644 --- a/src/main/java/fr/unistra/sil/erp/back/Config.java +++ b/src/main/java/fr/unistra/sil/erp/back/Config.java @@ -22,4 +22,6 @@ public class Config { public static final String MAPPING_SUBTRANSAC = URL_PREFIX + "/submitTransaction"; + public static final String MAPPING_GETSTOCKS = URL_PREFIX + + "/retrieveStocks"; } diff --git a/src/main/java/fr/unistra/sil/erp/back/api/controller/ApiSubmitTransactionController.java b/src/main/java/fr/unistra/sil/erp/back/api/controller/ApiSubmitTransactionController.java deleted file mode 100644 index 761f360c59151607bf1a205ee2341de074803f73..0000000000000000000000000000000000000000 --- a/src/main/java/fr/unistra/sil/erp/back/api/controller/ApiSubmitTransactionController.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template - */ -package fr.unistra.sil.erp.back.api.controller; - -import static fr.unistra.sil.erp.back.Config.MAPPING_SUBTRANSAC; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -/** - * REST Controller for submitting transactions. - * @author BEAUVAIS ANTOINE - */ -@RestController -public class ApiSubmitTransactionController { - - @RequestMapping(value=MAPPING_SUBTRANSAC, method = RequestMethod.POST) - public ResponseEntity<Object> submitTransaction(HttpServletRequest request, - HttpServletResponse response) - { - throw new UnsupportedOperationException("Not yet supported."); - } - -} diff --git a/src/main/java/fr/unistra/sil/erp/back/controller/IRetrieveCategoriesController.java b/src/main/java/fr/unistra/sil/erp/back/controller/IRetrieveCategoriesController.java new file mode 100644 index 0000000000000000000000000000000000000000..b719adc667fff08e59b9752826dd4fae8adf7f8b --- /dev/null +++ b/src/main/java/fr/unistra/sil/erp/back/controller/IRetrieveCategoriesController.java @@ -0,0 +1,22 @@ +/* + * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B + * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html + */ +package fr.unistra.sil.erp.back.controller; + +import org.springframework.http.ResponseEntity; + +/** + * Interface for designing access to categories. + * @author BEAUVAIS ANTOINE + */ +public interface IRetrieveCategoriesController { + + /** + * Retrieves all categories. + * @return the response. + * @throws java.lang.Exception when the request cannot be served. + */ + public ResponseEntity<Object> getCategories() throws Exception; + +} diff --git a/src/main/java/fr/unistra/sil/erp/back/controller/IRetrieveInfoController.java b/src/main/java/fr/unistra/sil/erp/back/controller/IRetrieveInfoController.java new file mode 100644 index 0000000000000000000000000000000000000000..8ca93af70fb842a4be53501c1c6310e39409683d --- /dev/null +++ b/src/main/java/fr/unistra/sil/erp/back/controller/IRetrieveInfoController.java @@ -0,0 +1,26 @@ +/* + * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B + * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html + */ +package fr.unistra.sil.erp.back.controller; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * Interface for designing the retrieval of articles. + * @author BEAUVAIS ANTOINE + */ +public interface IRetrieveInfoController { + + /** + * Retrieves the list of items. + * @param cat + * @return + * @throws Exception + */ + public ResponseEntity<Object> retrieveInfo( + @RequestParam(value = "category", defaultValue = "") String cat + ) throws Exception; + +} diff --git a/src/main/java/fr/unistra/sil/erp/back/controller/IRetrieveStocks.java b/src/main/java/fr/unistra/sil/erp/back/controller/IRetrieveStocks.java new file mode 100644 index 0000000000000000000000000000000000000000..883ba1d0be2eff2a4bba39ca484c6248f8332f02 --- /dev/null +++ b/src/main/java/fr/unistra/sil/erp/back/controller/IRetrieveStocks.java @@ -0,0 +1,20 @@ +/* + * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B + * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html + */ +package fr.unistra.sil.erp.back.controller; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.http.ResponseEntity; + +/** + * Interface for designing stocks access. + * @author BEAUVAIS ANTOINE + */ +public interface IRetrieveStocks { + + public ResponseEntity<Object> retrieveStocks(HttpServletRequest request, + HttpServletResponse response) throws Exception; + +} diff --git a/src/main/java/fr/unistra/sil/erp/back/controller/ISubmitTransactionController.java b/src/main/java/fr/unistra/sil/erp/back/controller/ISubmitTransactionController.java new file mode 100644 index 0000000000000000000000000000000000000000..e71ba5e5a0c0f2b0aa6c0fc7e8a7f25039d00993 --- /dev/null +++ b/src/main/java/fr/unistra/sil/erp/back/controller/ISubmitTransactionController.java @@ -0,0 +1,27 @@ +/* + * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B + * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html + */ +package fr.unistra.sil.erp.back.controller; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.http.ResponseEntity; + +/** + * Interface for designing transaction submission. + * @author BEAUVAIS ANTOINE + */ +public interface ISubmitTransactionController { + + /** + * Submits a transaction to the application. + * @param request the HTTP Servlet Request, provided by Spring Web + * @param response the HTTP Servlet Response, provided by Spring Web + * @return the response served to the user. + * @throws java.lang.Exception when the request cannot be served. + */ + public ResponseEntity<Object> submitTransaction(HttpServletRequest request, + HttpServletResponse response) throws Exception; + +} diff --git a/src/main/java/fr/unistra/sil/erp/back/api/controller/ApiBadRequestException.java b/src/main/java/fr/unistra/sil/erp/back/controller/api/ApiBadRequestException.java similarity index 87% rename from src/main/java/fr/unistra/sil/erp/back/api/controller/ApiBadRequestException.java rename to src/main/java/fr/unistra/sil/erp/back/controller/api/ApiBadRequestException.java index 645aa797556509d3b61f76edaa9ca32a415b5d6d..7443d03e099094f3e357ca526c2e9d7d4ed61af0 100644 --- a/src/main/java/fr/unistra/sil/erp/back/api/controller/ApiBadRequestException.java +++ b/src/main/java/fr/unistra/sil/erp/back/controller/api/ApiBadRequestException.java @@ -2,7 +2,7 @@ * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html */ -package fr.unistra.sil.erp.back.api.controller; +package fr.unistra.sil.erp.back.controller.api; /** * HTTP error 400 Bad Request for the API. diff --git a/src/main/java/fr/unistra/sil/erp/back/api/controller/ApiErrorHandler.java b/src/main/java/fr/unistra/sil/erp/back/controller/api/ApiErrorHandler.java similarity index 92% rename from src/main/java/fr/unistra/sil/erp/back/api/controller/ApiErrorHandler.java rename to src/main/java/fr/unistra/sil/erp/back/controller/api/ApiErrorHandler.java index 749f936e8f2e83b606bf8154f928ea26c90da2ad..2e85fb611529485eb509262a33e6e22b77bee8cf 100644 --- a/src/main/java/fr/unistra/sil/erp/back/api/controller/ApiErrorHandler.java +++ b/src/main/java/fr/unistra/sil/erp/back/controller/api/ApiErrorHandler.java @@ -2,9 +2,9 @@ * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html */ -package fr.unistra.sil.erp.back.api.controller; +package fr.unistra.sil.erp.back.controller.api; -import fr.unistra.sil.erp.back.api.model.ErrorMessage; +import fr.unistra.sil.erp.back.model.ErrorMessage; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.http.HttpStatus; diff --git a/src/main/java/fr/unistra/sil/erp/back/api/controller/ApiRetrieveCategoriesController.java b/src/main/java/fr/unistra/sil/erp/back/controller/api/ApiRetrieveCategoriesController.java similarity index 82% rename from src/main/java/fr/unistra/sil/erp/back/api/controller/ApiRetrieveCategoriesController.java rename to src/main/java/fr/unistra/sil/erp/back/controller/api/ApiRetrieveCategoriesController.java index 369679877448f3bbe56689a75e16752c82f05621..977b42ac2a0a98e445380991927cef9d2d34fda0 100644 --- a/src/main/java/fr/unistra/sil/erp/back/api/controller/ApiRetrieveCategoriesController.java +++ b/src/main/java/fr/unistra/sil/erp/back/controller/api/ApiRetrieveCategoriesController.java @@ -2,11 +2,13 @@ * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html */ -package fr.unistra.sil.erp.back.api.controller; +package fr.unistra.sil.erp.back.controller.api; import static fr.unistra.sil.erp.back.Config.MAPPING_GETCATEGORIES; +import static fr.unistra.sil.erp.back.Config.MAPPING_GETSTOCKS; import fr.unistra.sil.erp.back.DatabaseSystem; -import fr.unistra.sil.erp.back.api.model.Category; +import fr.unistra.sil.erp.back.controller.IRetrieveCategoriesController; +import fr.unistra.sil.erp.back.model.Category; import fr.unistra.sil.erp.back.db.DatabaseConnectionException; import fr.unistra.sil.erp.back.db.DatabaseInterface; import java.util.List; @@ -22,7 +24,8 @@ import org.springframework.web.bind.annotation.RestController; * @author BEAUVAIS ANTOINE */ @RestController -public class ApiRetrieveCategoriesController { +public class ApiRetrieveCategoriesController + implements IRetrieveCategoriesController { /** * Returns the list of categories in JSON format. @@ -30,6 +33,7 @@ public class ApiRetrieveCategoriesController { * @throws ApiServerErrorException Database failure. */ @GetMapping(MAPPING_GETCATEGORIES) + @Override public ResponseEntity<Object> getCategories() throws ApiServerErrorException { DatabaseInterface db; diff --git a/src/main/java/fr/unistra/sil/erp/back/api/controller/ApiRetrieveInfoController.java b/src/main/java/fr/unistra/sil/erp/back/controller/api/ApiRetrieveInfoController.java similarity index 80% rename from src/main/java/fr/unistra/sil/erp/back/api/controller/ApiRetrieveInfoController.java rename to src/main/java/fr/unistra/sil/erp/back/controller/api/ApiRetrieveInfoController.java index 3593e99a0488eeee4e71cd1edfb45feb5696192b..0b9e426bd58c3bd455aa145c897d04478633b97e 100644 --- a/src/main/java/fr/unistra/sil/erp/back/api/controller/ApiRetrieveInfoController.java +++ b/src/main/java/fr/unistra/sil/erp/back/controller/api/ApiRetrieveInfoController.java @@ -2,16 +2,18 @@ * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html */ -package fr.unistra.sil.erp.back.api.controller; +package fr.unistra.sil.erp.back.controller.api; import static fr.unistra.sil.erp.back.Config.MAPPING_RETRIEVEALL; import fr.unistra.sil.erp.back.DatabaseSystem; -import fr.unistra.sil.erp.back.api.model.Item; +import fr.unistra.sil.erp.back.controller.IRetrieveInfoController; +import fr.unistra.sil.erp.back.model.Item; import fr.unistra.sil.erp.back.db.DatabaseConnectionException; import fr.unistra.sil.erp.back.db.DatabaseInterface; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -20,17 +22,17 @@ import org.springframework.web.bind.annotation.RestController; /** * REST controller for the item list. - * @author BEAUVAIS ANTOINE <antoine.beauvais@etu.unistra.fr> + * @author BEAUVAIS ANTOINE */ @RestController -public class ApiRetrieveInfoController { +public class ApiRetrieveInfoController implements IRetrieveInfoController { /** * Returns all products as a JSON response. * @param cat an optional category. * @return a JSON response. - * @throws fr.unistra.sil.erp.back.api.controller.ApiServerErrorException - * @throws fr.unistra.sil.erp.back.api.controller.ApiBadRequestException + * @throws fr.unistra.sil.erp.back.controller.api.ApiServerErrorException + * @throws fr.unistra.sil.erp.back.controller.api.ApiBadRequestException */ @GetMapping(MAPPING_RETRIEVEALL) public ResponseEntity<Object> retrieveInfo( @@ -66,6 +68,8 @@ public class ApiRetrieveInfoController { if(res == null) throw new ApiServerErrorException("Failed to query info."); + else if(res.isEmpty()) + return ResponseEntity.noContent().build(); return new ResponseEntity<>(res, HttpStatus.OK); } diff --git a/src/main/java/fr/unistra/sil/erp/back/controller/api/ApiRetrieveStocks.java b/src/main/java/fr/unistra/sil/erp/back/controller/api/ApiRetrieveStocks.java new file mode 100644 index 0000000000000000000000000000000000000000..0e47d0062cc4dcfdceff438037734fb2815f6fe8 --- /dev/null +++ b/src/main/java/fr/unistra/sil/erp/back/controller/api/ApiRetrieveStocks.java @@ -0,0 +1,57 @@ +/* + * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B + * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html + */ +package fr.unistra.sil.erp.back.controller.api; + +import static fr.unistra.sil.erp.back.Config.MAPPING_GETSTOCKS; +import fr.unistra.sil.erp.back.DatabaseSystem; +import fr.unistra.sil.erp.back.controller.IRetrieveStocks; +import fr.unistra.sil.erp.back.db.DatabaseConnectionException; +import fr.unistra.sil.erp.back.db.DatabaseInterface; +import fr.unistra.sil.erp.back.model.Stock; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * Retrieves stocks in JSON format. + * @author BEAUVAIS ANTOINE + */ +@RestController +public class ApiRetrieveStocks implements IRetrieveStocks { + + /** + * Sends the stocks as JSON format back to the client. + * @param request the HTTP request. + * @param response the HTTP response. + * @return the response. + * @throws fr.unistra.sil.erp.back.controller.api.ApiServerErrorException + */ + @GetMapping(MAPPING_GETSTOCKS) + @Override + public ResponseEntity<Object> retrieveStocks(HttpServletRequest request, + HttpServletResponse response) throws ApiServerErrorException { + DatabaseInterface db; + try { + db = DatabaseSystem.getInstance(); + } catch (DatabaseConnectionException ex) { + Logger.getLogger(ApiRetrieveCategoriesController.class.getName()) + .log(Level.SEVERE, "Failed to connect to database.", ex); + throw new ApiServerErrorException("Database failure."); + } + + List<Stock> res = db.getStocks(); + if(res == null) + throw new ApiServerErrorException("Database failure."); + + return new ResponseEntity<>(res, HttpStatus.OK); + } + +} diff --git a/src/main/java/fr/unistra/sil/erp/back/api/controller/ApiServerErrorException.java b/src/main/java/fr/unistra/sil/erp/back/controller/api/ApiServerErrorException.java similarity index 88% rename from src/main/java/fr/unistra/sil/erp/back/api/controller/ApiServerErrorException.java rename to src/main/java/fr/unistra/sil/erp/back/controller/api/ApiServerErrorException.java index 235fc9883ec845054c0d6597718c7a772368933e..7cfe6a04e2f1049bfd5c91c077e507196f95a6ba 100644 --- a/src/main/java/fr/unistra/sil/erp/back/api/controller/ApiServerErrorException.java +++ b/src/main/java/fr/unistra/sil/erp/back/controller/api/ApiServerErrorException.java @@ -2,7 +2,7 @@ * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html */ -package fr.unistra.sil.erp.back.api.controller; +package fr.unistra.sil.erp.back.controller.api; /** * Returns HTTP 500 error page. diff --git a/src/main/java/fr/unistra/sil/erp/back/controller/api/ApiSubmitTransactionController.java b/src/main/java/fr/unistra/sil/erp/back/controller/api/ApiSubmitTransactionController.java new file mode 100644 index 0000000000000000000000000000000000000000..37189f0370ae9e38725a92824cdfaffd27dcf65b --- /dev/null +++ b/src/main/java/fr/unistra/sil/erp/back/controller/api/ApiSubmitTransactionController.java @@ -0,0 +1,72 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package fr.unistra.sil.erp.back.controller.api; + +import com.google.gson.Gson; +import com.google.gson.JsonParseException; +import static fr.unistra.sil.erp.back.Config.MAPPING_SUBTRANSAC; +import fr.unistra.sil.erp.back.controller.ISubmitTransactionController; +import fr.unistra.sil.erp.back.model.Transaction; +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.stream.Collectors; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +/** + * REST Controller for submitting transactions. + * @author BEAUVAIS ANTOINE + */ +@RestController +public class ApiSubmitTransactionController + implements ISubmitTransactionController { + + @RequestMapping(value=MAPPING_SUBTRANSAC, method = RequestMethod.POST) + @Override + public ResponseEntity<Object> submitTransaction(HttpServletRequest request, + HttpServletResponse response) throws ApiBadRequestException + { + Gson gson = new Gson(); + String body; + try { + body = request.getReader().lines() + .collect(Collectors.joining(System.lineSeparator())); + } catch (IOException ex) { + Logger.getLogger(ApiSubmitTransactionController.class.getName()) + .log(Level.SEVERE, "Unparseable body.", ex); + throw new ApiBadRequestException("Unparseable body."); + } + if(body == null) + throw new ApiBadRequestException("Missing JSON body."); + + Transaction t; + try + { + t = gson.fromJson(body, Transaction.class); + } + catch(JsonParseException ex) + { + throw new ApiBadRequestException("Invalid JSON: syntax error."); + } + + if(t == null) + throw new ApiBadRequestException("Missing JSON body."); + + if(!t.checkIfValid()) + throw new ApiBadRequestException("Invalid JSON schema."); + + System.out.println("Transaction : " + t.getItem() + + t.getType() + " " + t.getAmount()); + + return new ResponseEntity<>(t, HttpStatus.CREATED); + } + +} diff --git a/src/main/java/fr/unistra/sil/erp/back/db/DatabaseInterface.java b/src/main/java/fr/unistra/sil/erp/back/db/DatabaseInterface.java index 4c4b6176528a3e0ed2e2a5c083c7ac63b16d229f..19f0dfa184e3569167a30fda0aa17b2c09ac0709 100644 --- a/src/main/java/fr/unistra/sil/erp/back/db/DatabaseInterface.java +++ b/src/main/java/fr/unistra/sil/erp/back/db/DatabaseInterface.java @@ -4,8 +4,9 @@ */ package fr.unistra.sil.erp.back.db; -import fr.unistra.sil.erp.back.api.model.Category; -import fr.unistra.sil.erp.back.api.model.Item; +import fr.unistra.sil.erp.back.model.Category; +import fr.unistra.sil.erp.back.model.Item; +import fr.unistra.sil.erp.back.model.Stock; import java.util.List; /** @@ -38,4 +39,11 @@ public interface DatabaseInterface { */ public List<Category> getCategories(); + /** + * Returns the list of all stocks. + * + * @return the list of stocks. + */ + public List<Stock> getStocks(); + } diff --git a/src/main/java/fr/unistra/sil/erp/back/db/DatabaseSQLiteImpl.java b/src/main/java/fr/unistra/sil/erp/back/db/DatabaseSQLiteImpl.java index ce99530291f21dd3eb2261e01893e83b111178eb..6ba2ee98f936419de2e1056679f93269a65e6bda 100644 --- a/src/main/java/fr/unistra/sil/erp/back/db/DatabaseSQLiteImpl.java +++ b/src/main/java/fr/unistra/sil/erp/back/db/DatabaseSQLiteImpl.java @@ -4,8 +4,9 @@ */ package fr.unistra.sil.erp.back.db; -import fr.unistra.sil.erp.back.api.model.Category; -import fr.unistra.sil.erp.back.api.model.Item; +import fr.unistra.sil.erp.back.model.Category; +import fr.unistra.sil.erp.back.model.Item; +import fr.unistra.sil.erp.back.model.Stock; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; @@ -18,7 +19,7 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * + * SQLite implementation of the Database interface. * @author BEAUVAIS ANTOINE <antoine.beauvais@etu.unistra.fr> */ public class DatabaseSQLiteImpl implements DatabaseInterface { @@ -33,6 +34,11 @@ public class DatabaseSQLiteImpl implements DatabaseInterface { private static final String SQL_GETCATEGORIES = "SELECT id, name FROM categories"; + private static final String SQL_GETSTOCKS = + "SELECT s.id AS id, s.item AS item, " + + "i.name AS name, s.quantity AS quantity FROM stocks s " + + "INNER JOIN items i ON s.item = i.ref"; + private Connection conn; public DatabaseSQLiteImpl() @@ -156,5 +162,29 @@ public class DatabaseSQLiteImpl implements DatabaseInterface { return res; } + + @Override + public List<Stock> getStocks() { + ResultSet rs = this.query(SQL_GETSTOCKS); + if(rs == null) + return null; + + List<Stock> res = new ArrayList<>(); + try { + while(rs.next()) + { + Stock s = new Stock(rs.getInt("id"), + rs.getInt("item"), rs.getString("name"), + rs.getInt("quantity")); + res.add(s); + } + } catch (SQLException ex) { + Logger.getLogger(DatabaseSQLiteImpl.class.getName()).log( + Level.SEVERE, "Failed to fetch results.", ex); + return null; + } + + return res; + } } diff --git a/src/main/java/fr/unistra/sil/erp/back/api/model/Category.java b/src/main/java/fr/unistra/sil/erp/back/model/Category.java similarity index 95% rename from src/main/java/fr/unistra/sil/erp/back/api/model/Category.java rename to src/main/java/fr/unistra/sil/erp/back/model/Category.java index d27c80f355e9293c48179d49d242fe38820c7c9c..9e0fd210faf8a5c5f3938578adcf9d8de04e055d 100644 --- a/src/main/java/fr/unistra/sil/erp/back/api/model/Category.java +++ b/src/main/java/fr/unistra/sil/erp/back/model/Category.java @@ -2,7 +2,7 @@ * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html */ -package fr.unistra.sil.erp.back.api.model; +package fr.unistra.sil.erp.back.model; /** * Category entity. diff --git a/src/main/java/fr/unistra/sil/erp/back/api/model/ErrorMessage.java b/src/main/java/fr/unistra/sil/erp/back/model/ErrorMessage.java similarity index 90% rename from src/main/java/fr/unistra/sil/erp/back/api/model/ErrorMessage.java rename to src/main/java/fr/unistra/sil/erp/back/model/ErrorMessage.java index b0b869bf2dd8765aedbf3b05b2a770513b76de0a..c7fac546bdce415764dab989a3718df8bcdf7486 100644 --- a/src/main/java/fr/unistra/sil/erp/back/api/model/ErrorMessage.java +++ b/src/main/java/fr/unistra/sil/erp/back/model/ErrorMessage.java @@ -2,7 +2,7 @@ * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html */ -package fr.unistra.sil.erp.back.api.model; +package fr.unistra.sil.erp.back.model; /** * JSON error message. diff --git a/src/main/java/fr/unistra/sil/erp/back/api/model/Item.java b/src/main/java/fr/unistra/sil/erp/back/model/Item.java similarity index 98% rename from src/main/java/fr/unistra/sil/erp/back/api/model/Item.java rename to src/main/java/fr/unistra/sil/erp/back/model/Item.java index 0ff85122062e64fcbe5f0a6df58cc8de7ec16796..b37069dd569ff126f909c26bcde7feda0a1b6ecc 100644 --- a/src/main/java/fr/unistra/sil/erp/back/api/model/Item.java +++ b/src/main/java/fr/unistra/sil/erp/back/model/Item.java @@ -2,7 +2,7 @@ * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html */ -package fr.unistra.sil.erp.back.api.model; +package fr.unistra.sil.erp.back.model; import java.math.BigDecimal; diff --git a/src/main/java/fr/unistra/sil/erp/back/api/model/RegistryEntry.java b/src/main/java/fr/unistra/sil/erp/back/model/RegistryEntry.java similarity index 82% rename from src/main/java/fr/unistra/sil/erp/back/api/model/RegistryEntry.java rename to src/main/java/fr/unistra/sil/erp/back/model/RegistryEntry.java index 90d7ab7d67a46d8cee9973576cdbff6ebe4e7982..8cb06faaa8db023d4be7aa78248d2d69910e34ed 100644 --- a/src/main/java/fr/unistra/sil/erp/back/api/model/RegistryEntry.java +++ b/src/main/java/fr/unistra/sil/erp/back/model/RegistryEntry.java @@ -2,7 +2,7 @@ * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html */ -package fr.unistra.sil.erp.back.api.model; +package fr.unistra.sil.erp.back.model; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -16,19 +16,19 @@ public class RegistryEntry { private final int id; private final int transactionId; private final LocalDateTime dt; - private final String description; + private final int accountId; private final BigDecimal debit; private final BigDecimal credit; private final String remarks; public RegistryEntry(int id, int transactionId, LocalDateTime dt, - String description, BigDecimal debit, BigDecimal credit, + int accountId, BigDecimal debit, BigDecimal credit, String remarks) { this.id = id; this.transactionId = transactionId; this.dt = dt; - this.description = description; + this.accountId = accountId; this.debit = debit; this.credit = credit; this.remarks = remarks; @@ -49,9 +49,9 @@ public class RegistryEntry { return this.dt; } - public String getDescription() + public int getAccountId() { - return this.description; + return this.accountId; } public BigDecimal getDebit() diff --git a/src/main/java/fr/unistra/sil/erp/back/model/Stock.java b/src/main/java/fr/unistra/sil/erp/back/model/Stock.java new file mode 100644 index 0000000000000000000000000000000000000000..05c950448c5e4a89406c296a2247d2177401cc36 --- /dev/null +++ b/src/main/java/fr/unistra/sil/erp/back/model/Stock.java @@ -0,0 +1,48 @@ +/* + * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B + * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html + */ +package fr.unistra.sil.erp.back.model; + +/** + * Representation of a stock entry. + * @author BEAUVAIS ANTOINE + */ +public class Stock { + + private final int id; + + private final int itemId; + + private final String itemName; + + private final int quantity; + + public Stock(int id, int itemId, String itemName, int quantity) + { + this.id = id; + this.itemId = itemId; + this.itemName = itemName; + this.quantity = quantity; + } + + public int getId() + { + return this.id; + } + + public int getItemId() + { + return this.itemId; + } + + public String getItemName() + { + return this.itemName; + } + + public int getQuantity() + { + return this.quantity; + } +} diff --git a/src/main/java/fr/unistra/sil/erp/back/model/Transaction.java b/src/main/java/fr/unistra/sil/erp/back/model/Transaction.java new file mode 100644 index 0000000000000000000000000000000000000000..b4eadecb89526c673987a594a6b23b2c5cf71c3e --- /dev/null +++ b/src/main/java/fr/unistra/sil/erp/back/model/Transaction.java @@ -0,0 +1,58 @@ +/* + * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B + * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html + */ +package fr.unistra.sil.erp.back.model; + +import java.math.BigDecimal; + +/** + * Representation of a transaction. + * @author BEAUVAIS ANTOINE + */ +public class Transaction { + + private final Integer item; + + private final Integer type; + + private final BigDecimal amount; + + private final Integer quantity; + + public Transaction(Integer item, Integer type, BigDecimal amount, + Integer quantity) + { + this.item = item; + this.type = type; + this.amount = amount; + this.quantity = quantity; + } + + public Integer getItem() + { + return this.item; + } + + public Integer getType() + { + return this.type; + } + + public BigDecimal getAmount() + { + return this.amount; + } + + public Integer getQuantity() + { + return this.quantity; + } + + public boolean checkIfValid() + { + return (this.item != null && this.type != null + && this.amount != null && this.quantity != null); + } + +}