mirror of
				https://github.com/klmp200/PQT_Gestionnaire_vente_stock.git
				synced 2025-10-31 09:03:08 +00:00 
			
		
		
		
	Module Server : Ajout Javadoc pour StockService; MAJ javadoc clss ServerStateService
This commit is contained in:
		| @@ -13,6 +13,8 @@ import java.util.Date; | ||||
|  * ce serveur dans les messages, soit comme émetteur, soit comme destinataire. | ||||
|  * | ||||
|  * @see com.pqt.core.entities.messages.Message | ||||
|  * | ||||
|  * @author Guillaume "Cess" Prost | ||||
|  */ | ||||
| public class ServerStateService { | ||||
|  | ||||
|   | ||||
| @@ -5,9 +5,18 @@ import com.pqt.server.tools.entities.SaleContent; | ||||
| import com.pqt.server.tools.io.ISerialFileManager; | ||||
| import com.pqt.server.tools.io.SimpleSerialFileManagerFactory; | ||||
|  | ||||
| import java.lang.IllegalStateException; | ||||
| import java.util.*; | ||||
|  | ||||
| //TODO écrire Javadoc | ||||
| /** | ||||
|  * Implémentation de l'interface {@link IStockDao} utilisant un fichier de sauvegarde pour assurer la persistance des | ||||
|  * données liées aux produits vendus. | ||||
|  * <p/> | ||||
|  * Les données sont écrites et lues dans le fichier grâce au méchanisme de sérialisation/désérialisation. Elles ne sont | ||||
|  * pas faites pour être lisibles directement par un humain. | ||||
|  * | ||||
|  * @author Guillaume "Cess" Prost | ||||
|  */ | ||||
| public class FileStockDao implements IStockDao { | ||||
|  | ||||
|     private static final String STOCK_FILE_NAME = "stock.pqt"; | ||||
| @@ -17,7 +26,7 @@ public class FileStockDao implements IStockDao { | ||||
|  | ||||
| 	private Map<Long, Product> products; | ||||
|  | ||||
|     public FileStockDao() { | ||||
|     FileStockDao() { | ||||
|         random = new Random(); | ||||
|         fileManager = SimpleSerialFileManagerFactory.getFileManager(Product.class, STOCK_FILE_NAME); | ||||
|         loadFromFile(); | ||||
| @@ -41,7 +50,7 @@ public class FileStockDao implements IStockDao { | ||||
|  | ||||
|     private List<Product> copyOfProductList() { | ||||
| 	    List<Product> copy = new ArrayList<>(); | ||||
| 	    products.values().stream().forEach(p->copy.add(new Product(p))); | ||||
| 	    products.values().forEach(p->copy.add(new Product(p))); | ||||
|         return copy; | ||||
|     } | ||||
|  | ||||
| @@ -55,11 +64,13 @@ public class FileStockDao implements IStockDao { | ||||
| 	/** | ||||
| 	 * @see com.pqt.server.module.stock.IStockDao#addProduct(com.pqt.core.entities.product.Product) | ||||
| 	 */ | ||||
| 	public void addProduct(Product product) { | ||||
| 	public long addProduct(Product product) { | ||||
| 	    product.setId(nextProductId); | ||||
|         this.products.put(nextProductId, product); | ||||
|         long reply = nextProductId; | ||||
|         generateNextProductId(); | ||||
|         saveToFile(); | ||||
|         return reply; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| @@ -68,7 +79,7 @@ public class FileStockDao implements IStockDao { | ||||
| 	public void removeProduct(long id) { | ||||
|         Product product = getProduct(id); | ||||
| 	    if(product!=null){ | ||||
| 	        this.products.remove(product); | ||||
| 	        this.products.remove(product.getId()); | ||||
| 	        saveToFile(); | ||||
|         } | ||||
| 	} | ||||
| @@ -86,11 +97,14 @@ public class FileStockDao implements IStockDao { | ||||
|  | ||||
|     @Override | ||||
|     public void applySale(SaleContent saleContent) throws IllegalArgumentException { | ||||
| 	    if(saleContent==null) | ||||
| 	        return; | ||||
|  | ||||
| 	    try { | ||||
|             saleContent.getProductList().forEach(product -> { | ||||
| 	        for(Product product : saleContent.getProductList()){ | ||||
|                 applyRecursiveStockRemoval(product, saleContent.getProductAmount(product)); | ||||
|                 applySoldCounterIncrease(product, saleContent.getProductAmount(product)); | ||||
|             }); | ||||
|             } | ||||
|             saveToFile(); | ||||
|         }catch (IllegalStateException e){ | ||||
| 	        loadFromFile(); | ||||
| @@ -98,35 +112,61 @@ public class FileStockDao implements IStockDao { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void applySoldCounterIncrease(Product product, Integer amount) { | ||||
|     /** | ||||
|      * Cette méthode augmente le compteur de vente pour un produit donné dans la BDD. | ||||
|      * | ||||
|      * @param product données à utiliser pour déterminer le produit correspondant dans la BDD dont les données doivent | ||||
|      *                être manipulées. | ||||
|      * @param amount montant à ajouter | ||||
|      * @throws IllegalStateException exception levée si le produit donné ne peut pas être trouvé dans la base de donnée. | ||||
|      */ | ||||
|     private void applySoldCounterIncrease(Product product, Integer amount) throws IllegalStateException{ | ||||
| 	    Product correspondingProduct = getProduct(product.getId()); | ||||
| 	    if(correspondingProduct!=null){ | ||||
| 	        correspondingProduct.setAmountSold(correspondingProduct.getAmountSold() + amount); | ||||
|         }else{ | ||||
|             StringBuffer sb = new StringBuffer("StockService>StockDao : Un produit vendu ne correspond pas à un produit connu : "); | ||||
|             StringBuilder sb = new StringBuilder("StockService>StockDao : Un produit vendu ne correspond pas à un produit connu : "); | ||||
|             sb.append(product.getId()).append(" - ").append(product.getName()).append("(").append(product.getCategory()).append(")"); | ||||
|             throw new IllegalStateException(sb.toString()); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void applyRecursiveStockRemoval(Product product, int amount)throws IllegalStateException{ | ||||
|     /** | ||||
|      * Cette méthode retire à un produit donné de la BDD le montant spécifié (diminue la valeur de | ||||
|      * {@link Product#amountRemaining}), puis effectue récursivement la même opération pour tous les composants de ce | ||||
|      * produit. | ||||
|      * | ||||
|      * @param product données à utiliser pour déterminer le produit correspondant dans la BDD dont les données doivent | ||||
|      *                être manipulées. | ||||
|      * @param amount montant à déduire | ||||
|      * @throws IllegalStateException exception levée si le produit donné ne peut pas être trouvé dans la base de donnée. | ||||
|      */ | ||||
|     private void applyRecursiveStockRemoval(Product product, int amount) throws IllegalStateException { | ||||
|         Product correspondingProduct = getProduct(product.getId()); | ||||
|         if(correspondingProduct!=null) { | ||||
|             correspondingProduct.setAmountRemaining(correspondingProduct.getAmountRemaining() - amount); | ||||
|             correspondingProduct.getComponents().forEach(component -> applyRecursiveStockRemoval(component, amount)); | ||||
|         }else{ | ||||
|             StringBuffer sb = new StringBuffer("StockService>StockDao : Un produit vendu ne correspond pas à un produit connu : "); | ||||
|             StringBuilder sb = new StringBuilder("StockService>StockDao : Un produit vendu ne correspond pas à un produit connu : "); | ||||
|             sb.append(product.getId()).append(" - ").append(product.getName()).append("(").append(product.getCategory()).append(")"); | ||||
|             throw new IllegalStateException(sb.toString()); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Cette méthode charge les données relatives aux produits depuis le fichier de sauvegarde. Si ce fichier n'existe | ||||
|      * pas, il est créé et la liste des produits est vidée. | ||||
|      */ | ||||
|     private void loadFromFile() { | ||||
|         Map<Long, Product> loadedData = new HashMap<>(); | ||||
|         fileManager.loadListFromFile().forEach(product -> loadedData.put(product.getId(), product)); | ||||
|         products = new HashMap<>(loadedData); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Cette méthode écrit les données relatives aux produits dans le fichier de sauvegarde, écrasant le contenu | ||||
|      * précédent. | ||||
|      */ | ||||
|     private void saveToFile() { | ||||
| 	    fileManager.saveListToFile(new ArrayList<>(products.values())); | ||||
|     } | ||||
|   | ||||
| @@ -6,18 +6,62 @@ import com.pqt.server.tools.entities.SaleContent; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
|  | ||||
| //TODO écrire javadoc | ||||
| /** | ||||
|  * Interface définissant les méthodes requises pour tout DAO du service de gestion des commandes {@link StockService}. | ||||
|  * <p/> | ||||
|  * Les implémentations doivent assurer une persistance des données relatives aux produits vendus, et doivent assurer | ||||
|  * les modifications et les applications de ventes. | ||||
|  * | ||||
|  * @see StockService pour de plus amples détails sur le fonctionnement attendu des méthodes | ||||
|  * | ||||
|  * @author Guillaume "Cess" Prost | ||||
|  */ | ||||
| public interface IStockDao { | ||||
|  | ||||
| 	public List<Product> getProductList(); | ||||
|     /** | ||||
|      * Renvoie une copie de la liste des produits contenus dans la base de donnée. | ||||
|      * @return copie de la liste des produits. | ||||
|      */ | ||||
| 	List<Product> getProductList(); | ||||
|  | ||||
| 	public Product getProduct(long id); | ||||
|     /** | ||||
|      * Renvoie le produit correspondant à l'identifiant donné. | ||||
|      * @param id identifiant du produit à récupérer | ||||
|      * @return Produit correspondant, ou {@code null} si aucun produit ne correspond | ||||
|      */ | ||||
| 	Product getProduct(long id); | ||||
|  | ||||
| 	public void addProduct(Product product); | ||||
|     /** | ||||
|      * Ajoute un produit dans la base de donnée. Son identifiant sera éventuellement modifié pour éviter les conflits. | ||||
|      * Dans tous les cas, l'identifiant final du produit est renvoyé une fois l'ajout effectué. | ||||
|      * @param product produit à ajouter$ | ||||
|      * @return identifiant du produit ajouté. | ||||
|      */ | ||||
| 	long addProduct(Product product); | ||||
|  | ||||
| 	public void removeProduct(long id); | ||||
|     /** | ||||
|      * Supprime le produit correspondant à l'identifiant donné. | ||||
|      * @param id identifiant du produit à supprimer. | ||||
|      */ | ||||
| 	void removeProduct(long id); | ||||
|  | ||||
| 	public void modifyProduct(long id, Product product); | ||||
|  | ||||
| 	void applySale(SaleContent productAmounts) throws IllegalArgumentException; | ||||
|     /** | ||||
|      * Modifie le produit correspondant à l'identifiant donné en le remplaçant par {@code product}. L'identifiant | ||||
|      * reste inchangé. | ||||
|      * <p/> | ||||
|      * <b>Si {@code id} ne correspond à aucun produit, aucune modification n'est effectué. Cela signifie que | ||||
|      * {@code product} n'est pas ajouté à la BDD.</b> | ||||
|      * @param id identifiant du produit à modifier | ||||
|      * @param product nouvelle version du produit | ||||
|      */ | ||||
| 	void modifyProduct(long id, Product product); | ||||
|  | ||||
|     /** | ||||
|      * Applique les modifications de stocks liées à une commande validée, représenté par {@code saleContent}. | ||||
|      * <p/> | ||||
|      * @param saleContent détail des produits et quantités de la commande validée. | ||||
|      * @throws IllegalArgumentException Exception levée si une erreur liée au contenu de {@code saleContent} survient. | ||||
|      */ | ||||
| 	void applySale(SaleContent saleContent) throws IllegalArgumentException; | ||||
| } | ||||
|   | ||||
| @@ -8,8 +8,22 @@ import com.pqt.server.tools.entities.SaleContent; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
|  | ||||
| //TODO écrire Javadoc | ||||
| //TODO ajouter logs | ||||
|  | ||||
| /** | ||||
|  *  Cette classe correspond au service de gestion du stock de produits. Il est en charge de la persistance des | ||||
|  *  données liées aux produits, de founir un accès centralisé à ces données et se charge également d'appliquer les | ||||
|  *  mises à jour de stock (ajout, modif ou suppr de produits) et les ventes de produits issues des commandes | ||||
|  *  (modification des quantités). | ||||
|  *  <p/> | ||||
|  *  <b>Attention : ce service ne se charge pas de valider les commandes, il ne fait que modifier les quantités comme si | ||||
|  *  la commande avait été validé</b> | ||||
|  * | ||||
|  * @see Product | ||||
|  * @see ProductUpdate | ||||
|  * @see SaleContent | ||||
|  * @author Guillaume "Cess" Prost | ||||
|  */ | ||||
| public class StockService { | ||||
|  | ||||
|     private IStockDao dao; | ||||
| @@ -26,8 +40,8 @@ public class StockService { | ||||
| 		return dao.getProduct(id); | ||||
| 	} | ||||
|  | ||||
| 	public void applySale(SaleContent productAmounts) { | ||||
| 		dao.applySale(productAmounts); | ||||
| 	public void applySale(SaleContent saleContent) { | ||||
| 		dao.applySale(saleContent); | ||||
| 	} | ||||
|  | ||||
| 	public void applyUpdateList(List<ProductUpdate> updates) throws ServerQueryException{ | ||||
| @@ -39,7 +53,7 @@ public class StockService { | ||||
| 			}else if(upd.getOldVersion()!=null && upd.getNewVersion()!=null){ | ||||
| 				modifyProduct(upd.getOldVersion().getId(), upd.getNewVersion()); | ||||
| 			}else{ | ||||
| 			    //TODO écrit le throw d'une ServerQueryException | ||||
| 				throw new ServerQueryException("Object ProductUpdate invalide : old et new vallent tous les deux null"); | ||||
|             } | ||||
| 		} | ||||
| 	} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user