package sn.unitech.stock.bean;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.Serializable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIParameter;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.imageio.ImageIO;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import sn.unitech.common.dao.ReadProperties;
import sn.unitech.stock.entity.DetailCommand;
import sn.unitech.stock.entity.DetailEvent;
import sn.unitech.stock.entity.Fournisseur;
import sn.unitech.stock.entity.SysGroupProd;
import sn.unitech.stock.entity.SysProduit;
import sn.unitech.stock.metier.ChartM;
import sn.unitech.stock.metier.ToolsMetier;
import sn.unitech.stock.metier.iface.IChartM;
import sn.unitech.stock.modal.DataForGraph;
import sn.unitech.stock.modal.Noeud;
@ManagedBean
@ViewScoped
public class ChartMBean implements Serializable{
private ReadProperties readProperties=ReadProperties.getReadProperties();
private SimpleDateFormat format=new SimpleDateFormat("dd/MM/yyyy");
private IChartM chartM =new ChartM();
private DataForGraph dataForGraphVariation= new DataForGraph();
private DataForGraph dataForGraphComparaison= new DataForGraph();
private CItems citems=new CItems();
private Cproperties cproperties=citems;
private Fournisseur fournisseur=new Fournisseur();
public ChartMBean(){
// this.getDataForGraphComparaison();
// this.getDataForGraphVariation();
}
ParamsUser getParamsUser(){ //alias
return ((ParamsUser)ToolsBean.getToolsBean().getAttribute(ToolsBean.idParamUser));
}
public Map defaultParametter(){
Map param=new HashMap<Integer,Object>();
param.put(0,getParamsUser().adherent.getIdAdherent());
return param;
}
public void clickProduit(ActionEvent e){
String id= ((UIParameter) e.getComponent().findComponent("idProduit")).getValue().toString();
this.cproperties.setIdProduit(Integer.parseInt(id));
this.cproperties.libelleProduit=((UIParameter) e.getComponent().findComponent("libelleProduit")).getValue().toString();
}
public void changeFournisseur(ValueChangeEvent e){
if(e.getNewValue()!=null){
this.cproperties.setIdFournisseur(Integer.parseInt(e.getNewValue().toString()));
this.fournisseur= this.chartM.getCurrentFournisseur(this.cproperties.idFournisseur);
this.citems.getItemsCommande();
if((this.citems.itemsCommande!=null)&&(this.citems.itemsCommande.size()>0))
this.cproperties.setIdCommande(this.citems.itemsCommande.values().iterator().next());
else this.cproperties.setIdCommande(-1);
this.dataForGraphComparaison.getCurrentDataset().clear();
}
else this.fournisseur=new Fournisseur();
}
public void changeCommande(ValueChangeEvent e){
if(e.getNewValue()!=null){
this.cproperties.setIdCommande(Integer.parseInt(e.getNewValue().toString()));
this.getDataForGraphComparaison();
}
}
public Map<Integer,Date> getAbcisses(){
if((this.cproperties.getDatDeb()!=null)&&(this.cproperties.getDatFin()!=null)&&
(this.cproperties.getIdProduit()!=null)){
int coefficiant=12/this.cproperties.idPeriode;
Map<Integer,Date> abcisses=new HashMap<Integer, Date>();
java.util.Calendar deb=ToolsMetier.createCalendarFromDate(this.cproperties.getDatDeb());
java.util.Calendar fin=ToolsMetier.createCalendarFromDate(this.cproperties.getDatFin());
deb.add(Calendar.MONTH,-coefficiant);
abcisses.put(0,deb.getTime());
int i=1;
deb.add(Calendar.MONTH,coefficiant);
while(deb.getTime().compareTo(fin.getTime())<=0){
abcisses.put(i++,deb.getTime());
deb.add(Calendar.MONTH,coefficiant);
}
if(abcisses.get(abcisses.size()-1).compareTo(fin.getTime())<0)
abcisses.put(i,fin.getTime());
return abcisses;
}
else return null;
}
public Double getQtes(Date debut,Date fin){
int qteD=0,qteC=0;
Double qte=0d;
List<DetailEvent>listInvent=this.citems.getListInventaires();
for(int i=0;(listInvent!=null)&&(i<listInvent.size());i++){
if((listInvent.get(i).getSysDate().compareTo(debut)>0)&&
(listInvent.get(i).getSysDate().compareTo(fin)<=0)){
int rapport=listInvent.get(i).getStock().getSysProduit().getRapport();
qteC=listInvent.get(i).getQteContenant();
qteD=listInvent.get(i).getQteDetail();
if(rapport>0) qte+=qteC+(qteD/rapport);
else qte+=qteC;
}
}
return qte;
}
public Double getTotalLivr�(int idProduit){
Double qte=0d;
for(DetailEvent detailEvent:this.citems.listLivraison)
if(detailEvent.getStock().getSysProduit().getIdProduit()==idProduit)
qte+=detailEvent.getQteContenant();
return qte;
}
public DataForGraph getDataForGraphVariation() {
DataForGraph dataForGraph=new DataForGraph();
DefaultCategoryDataset categDataset=new DefaultCategoryDataset();
Double qte;
categDataset.clear();
Map<Integer,Date> abcisses=this.getAbcisses();
for(int i=1;(abcisses!=null)&&(i<abcisses.size());i++){
qte=this.getQtes(abcisses.get(i-1),abcisses.get(i));
categDataset.addValue(qte,"series1",format.format(abcisses.get(i)));
}
dataForGraph.setCurrentDataset(categDataset);
dataForGraph.setTitre(this.cproperties.libelleProduit);
dataForGraph.setHeight(250);
dataForGraph.setWidth(500);
dataForGraph.setType(ToolsBean.LINE_TYPE);
return (this.dataForGraphVariation=dataForGraph);
}
public DataForGraph getDataForGraphComparaison() {
DataForGraph dataForGraph=new DataForGraph();
DefaultCategoryDataset categDataset=new DefaultCategoryDataset();
this.citems.getListDetailCommande();
this.citems.getListLivraison();
for(DetailCommand detailCommand:this.citems.listDetailCommande){
int idProduit=detailCommand.getSysProduit().getIdProduit();
categDataset.setValue(new Double(detailCommand.getQteContenant()),"qt� command�e",idProduit+"");
categDataset.setValue( this.getTotalLivr�(idProduit),"qt� livr�e",idProduit+"");
}
dataForGraph.setCurrentDataset(categDataset);
if((this.cproperties.idCommande!=null)&&(this.cproperties.idCommande > 0))
dataForGraph.setTitre("Commande N� "+this.cproperties.idCommande);
else dataForGraph.setTitre("");
dataForGraph.setHeight(250);
dataForGraph.setWidth(600);
dataForGraph.setType(ToolsBean.BAR_TYPE);
return (this.dataForGraphComparaison=dataForGraph);
}
public void setDataForGraphVariation(DataForGraph dataForGraphVariation) {
this.dataForGraphVariation = dataForGraphVariation;
}
public void setDataForGraphComparaison(DataForGraph dataForGraphComparaision) {
this.dataForGraphComparaison = dataForGraphComparaision;
}
public void generateChartMethod(java.io.OutputStream out, Object data) {
DataForGraph dataGraph=(DataForGraph)data;
JFreeChart chart;
if(dataGraph.getType().equals(ToolsBean.BAR_TYPE))
chart = ChartFactory.createBarChart3D(dataGraph.getTitre(),null,"",dataGraph.getCurrentDataset(),PlotOrientation.VERTICAL,true,true,false);
else chart = ChartFactory.createLineChart3D(dataGraph.getTitre(),null,"",dataGraph.getCurrentDataset(),PlotOrientation.VERTICAL,true,true,false);
BufferedImage buffImg = chart.createBufferedImage(
dataGraph.getWidth(), //width
dataGraph.getHeight(), //height
BufferedImage.TYPE_INT_RGB, //image type
null);
try {ImageIO.write(buffImg, "jpeg", out);}
catch (IOException e) {e.printStackTrace();}
}
public CItems getCitems() {
return citems;
}
public void setCitems(CItems citems) {
this.citems = citems;
}
public Cproperties getCproperties() {
return cproperties;
}
public void setCproperties(Cproperties cproperties) {
this.cproperties = cproperties;
}
public Fournisseur getFournisseur() {
return fournisseur;
}
public void setFournisseur(Fournisseur fournisseur) {
this.fournisseur = fournisseur;
}
public class Cproperties{
private Date datDeb;
private Date datFin;
private Integer idProduit;
private String idOperations;
private Integer idPeriode;
String libelleProduit;
Integer idFournisseur;
Integer idCommande;
public Date getDatDeb() {
return datDeb;
}
public void setDatDeb(Date datDeb) {
this.datDeb = datDeb;
}
public Date getDatFin() {
return datFin;
}
public void setDatFin(Date datFin) {
this.datFin = datFin;
}
public Integer getIdProduit() {
return idProduit;
}
public void setIdProduit(Integer idProduit) {
this.idProduit = idProduit;
}
public String getIdOperations() {
return idOperations;
}
public void setIdOperations(String idOperations) {
this.idOperations = idOperations;
}
public Integer getIdPeriode() {
return idPeriode;
}
public void setIdPeriode(Integer idPeriode) {
this.idPeriode = idPeriode;
}
public Integer getIdFournisseur() {
return idFournisseur;
}
public void setIdFournisseur(Integer idFournisseur) {
this.idFournisseur = idFournisseur;
}
public Integer getIdCommande() {
return idCommande;
}
public void setIdCommande(Integer idCommande) {
this.idCommande = idCommande;
}
}
public class CItems extends Cproperties{
Map<String,String> itemsOperation=new HashMap<String, String>();
Map<String,Integer> itemsPeriode=new HashMap<String, Integer>();
List<DetailEvent> listInventaires;
List<DetailCommand> listDetailCommande;
List<DetailEvent> listLivraison;
List<Noeud> listProduits;
Map<String, Integer> itemsCommande=new HashMap<String, Integer>();
Map<String, Integer> itemsFournisseurs=new HashMap<String, Integer>();
public CItems(){
this.itemsOperation=chartM.getAllOperation(readProperties.read("Events.allOperation"),defaultParametter());
this.itemsPeriode=chartM.findAllPeriodes(readProperties.read("Events.allPeriode"),null);
this.listProduits=this.getNodesGroupProd();
this.setIdOperations(this.itemsOperation.values().iterator().next());
this.itemsFournisseurs=chartM.getAllFournisseurs(readProperties.read("Events.allFournisseur"),defaultParametter());
if((this.itemsFournisseurs!=null)&&(this.itemsFournisseurs.size()>0)){
this.idFournisseur=this.itemsFournisseurs.values().iterator().next();
fournisseur= chartM.getCurrentFournisseur(this.idFournisseur);
this.getItemsCommande();
}
}
public List<Noeud> getNodesGroupProd(){
List<Noeud> listResult=new ArrayList<Noeud>();
for(SysGroupProd sysGroupProd:chartM.findGroupProd(readProperties.read("FamilleProduit.jpqlAllGroupProd"),defaultParametter())){
Noeud parent=new Noeud();
parent.setId(sysGroupProd.getIdGroupProd()+"");
parent.setLibelle(sysGroupProd.getLibelle());
listResult.add(parent);
for(SysProduit sysProduit:sysGroupProd.getSysProduits()){
Noeud fils=new Noeud();
fils.setId(sysProduit.getIdProduit()+"");
fils.setLibelle(sysProduit.getDesignation());
parent.getListChildren().add(fils);
}
}
return listResult;
}
public List<Noeud> getListProduits() {
return listProduits;
}
public void setListProduits(List<Noeud> listProduits) {
this.listProduits = listProduits;
}
public List<DetailEvent> getListInventaires() {
Map<Integer,Object> params=new HashMap<Integer, Object>();
params.put(0,this.getIdProduit());
params.put(1, this.getIdOperations());
params.put(2,this.getDatDeb());
params.put(3,this.getDatFin());
return (listInventaires=chartM.getInventaire(readProperties.read("Statistiques.Inventaire"),params));
}
public void setListInventaires(List<DetailEvent> listInventaires) {
this.listInventaires = listInventaires;
}
public Map<String, String> getItemsOperation() {
return itemsOperation;
}
public void setItemsOperation(Map<String, String> itemsOperation) {
this.itemsOperation = itemsOperation;
}
public Map<String, Integer> getItemsPeriode() {
return itemsPeriode;
}
public void setItemsPeriode(Map<String, Integer> itemsPeriode) {
this.itemsPeriode = itemsPeriode;
}
public Map<String, Integer> getItemsCommande() {
Map<Integer,Integer> param=new HashMap<Integer,Integer>();
param.put(0,this.idFournisseur);
this.itemsCommande=chartM.getAllCommandes(readProperties.read("Events.allCommandeFournisseur"),param);
return itemsCommande;
}
public void setItemsCommande(Map<String, Integer> itemsCommande) {
this.itemsCommande = itemsCommande;
}
public Map<String, Integer> getItemsFournisseurs() {
return this.itemsFournisseurs;
}
public void setItemsFournisseurs(Map<String, Integer> itemsFournisseurs) {
this.itemsFournisseurs = itemsFournisseurs;
}
public List<DetailCommand> getListDetailCommande() {
Map<Integer, Integer> param=new HashMap<Integer, Integer>();
param.put(0,this.idCommande);
this.listDetailCommande=chartM.getListeDetailCommand(readProperties.read("Statistiques.detailCommande"), param);
return listDetailCommande;
}
public void setListDetailCommande(List<DetailCommand> listDetailCommande) {
this.listDetailCommande = listDetailCommande;
}
public List<DetailEvent> getListLivraison() {
Map<Integer, Integer> param=new HashMap<Integer, Integer>();
param.put(0,this.idCommande);
this.listLivraison=chartM.getInventaire(readProperties.read("Statistiques.livraison"),param);
return listLivraison;
}
public void setListLivraison(List<DetailEvent> listLivraison) {
this.listLivraison = listLivraison;
}
}
public static void main(String args[]) throws ParseException{
ChartMBean c= new ChartMBean();
c.getCproperties().setDatDeb(new SimpleDateFormat("dd/MM/yyyy").parse("31/05/2010"));
c.getCproperties().setDatFin(new Date());
c.getCproperties().setIdProduit(69);
c.getCproperties().setIdPeriode(12);
c.getCproperties().setIdOperations("VT");
c.getCproperties().setIdCommande(48);
//c.getDatasetComparaison();
/* SimpleDateFormat f= new SimpleDateFormat("dd/MM/yyyy");
System.out.println(f.parse("17/06/2010").compareTo((new Date())));*/
}
}