package factories;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import base.Commande;
import factories.exceptions.FactoriesException;
/**
*
* @author brahim
*
*/
public class FCommandes {
// private List cacheCommandes;
// Selection depuis la bdd
private String selectCommande = " select * from commande where idCommande = ?";
private String selectCommandesClient = " select * from commande where idClient = ? ";
private String selectLignesCommande = " select * from ligneCommande where idCommande = ? ";
// Insertion dans la bdd
private String insererCommande = " insert into commande(idCommande,dateCommande,montant,idClient) values(?,?,?,?) ";
private String insererLigneCommande = " insert into ligneCommande(idCommande,refProduit,qte) "+
" values(?,?,?) ";
// Deletion de la bdd
private String deleteCommande = "DELETE FROM COMMANDE WHERE IDCOMMANDE = ?";
private String deleteLignesCommande = "DELETE FROM LIGNECOMMANDE WHERE IDCOMMANDE = ?";
private PreparedStatement pSelectCommande,pSelectCommandesClient,pInsererCommande,
pSelectLignesCommande,pInsererLigneCommande, pDeleteCommande, pDeleteLignesCommande;
private FCommandes() {
// cacheCommandes = new ArrayList<Commande>();
}
/*
* Connexion JDBC
*/
private Connection c;
/*
* Traitement du singleton de la fabrique
*/
private static FCommandes instance;
/**
* Recuperation du singleton de la fabrique
*
* @return un singleton de la fabrique
*/
public static FCommandes getInstance() {
if (instance == null)
instance = new FCommandes();
return instance;
}
/**
* Preparation des statements
*
*/
private void init() throws SQLException {
/* Création des statements */
// Statements des Select
pSelectCommande = c.prepareStatement(selectCommande);
pSelectCommandesClient = c.prepareStatement(selectCommandesClient);
pSelectLignesCommande = c.prepareStatement(selectLignesCommande);
// Statements d'insertion
pInsererLigneCommande = c.prepareStatement(insererLigneCommande);
pInsererCommande = c.prepareStatement(insererCommande);
pDeleteCommande = c.prepareStatement(deleteCommande);
pDeleteLignesCommande = c.prepareStatement(deleteLignesCommande);
}
/**
* Mise en place d'une connexion JDBC au singleton
*
* @param c
* @throws SQLException
*/
public void setConnection(Connection c) throws SQLException {
this.c = c;
this.init();
}
/**
*
* @param idClient
* @return
* @throws SQLException
*/
public List<String> getCommandesClient(String idClient) throws SQLException {
pSelectCommandesClient.clearParameters();
pSelectCommandesClient.setString(1, idClient);
List<String> listIdCommandes = new ArrayList<String>();
ResultSet rsCommandes = pSelectCommandesClient.executeQuery();
while(rsCommandes.next()){
listIdCommandes.add(rsCommandes.getString(1));
}
return listIdCommandes;
}
/**
*
* @param idCommande
* @param idClient
* @return
* @throws SQLException
*/
public Commande rechercherCommande(String idCommande,String idClient)
throws SQLException{
pSelectCommande.clearParameters();
pSelectCommande.setString(1, idCommande);
ResultSet rsCommande = pSelectCommande.executeQuery();
Commande commande = null;
if(rsCommande.next()){
Date dateCommande = rsCommande.getDate(2);
double montant = rsCommande.getDouble(3);
commande = new Commande(idCommande,idClient,dateCommande);
commande.setPrixTotal(montant);
pSelectLignesCommande.clearParameters();
pSelectLignesCommande.setString(1, idCommande);
ResultSet rsLignesCommande = pSelectLignesCommande.executeQuery();
// On ajoute les produits à la commande
while(rsLignesCommande.next()){
String refProduit = rsLignesCommande.getString(2);
int qte = rsLignesCommande.getInt(3);
commande.ajouterProduit(refProduit, qte);
}
}
return commande;
}
/**
* Creation d'une commande dans la base, et de ses lignes.
* @param c
* @return
* @throws SQLException
*/
public synchronized int creerCommande(Commande c) throws SQLException, FactoriesException{
// verification rapide/complete de l'existence d'une commande
/*if(rechercherCommande(c.getIdCommande(), c.getLeClient()) != null)
throw new FactoriesException(FactoriesException.COMMANDE_EXISTE_DEJA);*/
pInsererCommande.clearParameters();
String idCommande = c.getIdCommande();
String idClient = c.getLeClient();
pInsererCommande.setString(1,idCommande);
pInsererCommande.setDate(2,c.getDateCommande());
pInsererCommande.setDouble(3, c.getPrixTotal());
pInsererCommande.setString(4, idClient);
pInsererCommande.executeUpdate();
int res = -1;
// Insertion des lignes de commandes
HashMap<String,Integer> lesProduits = c.getLesProduits();
Iterator<String> it = lesProduits.keySet().iterator();
while(it.hasNext()){
String refProduit = it.next();
pInsererLigneCommande.clearParameters();
pInsererLigneCommande.setString(1,idCommande);
pInsererLigneCommande.setString(2, refProduit);
pInsererLigneCommande.setInt(3, lesProduits.get(refProduit));
pInsererLigneCommande.executeUpdate();
}
return res;
}
/**
* Verifier si la connexion a la base de donnees existe
* @return Confirmation d'existence ou pas d'une connexion.
*/
public boolean hasConnection(){
return (this.c != null);
}
/**
* Suppression d'une commande dans la base, et de ses lignes.
* @param idCde Reference de la commande
* @return
* @throws SQLException
*/
public synchronized int supprimerCommande(Commande c)
throws SQLException, FactoriesException{
// verification rapide/complete de l'existence d'une commande
if(rechercherCommande(c.getIdCommande(), c.getLeClient()) == null)
throw new FactoriesException(FactoriesException.COMMANDE_EXISTE_PAS);
pDeleteCommande.clearParameters();
pDeleteCommande.setString(1, c.getIdCommande());
pDeleteLignesCommande.clearParameters();
pDeleteLignesCommande.setString(1, c.getIdCommande());
int res = -1;
res = pDeleteLignesCommande.executeUpdate();
res += pDeleteCommande.executeUpdate();
return res;
}
}