package sn.unitech.stock.dao;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import sn.unitech.common.dao.ReadProperties;
import sn.unitech.stock.entity.Compte;
import sn.unitech.stock.entity.DetailEvent;
import sn.unitech.stock.entity.Ecritures;
import sn.unitech.stock.entity.EcrituresId;
import sn.unitech.stock.entity.Events;
import sn.unitech.stock.entity.IUniversel;
import sn.unitech.stock.entity.Stock;
import sn.unitech.stock.entity.SysAdherEventId;
import sn.unitech.stock.entity.SysEcrits;
import sn.unitech.stock.entity.SysEvents;
import sn.unitech.stock.entity.SysProduit;
import sn.unitech.stock.entity.SysTaxe;
import sn.unitech.stock.entity.SysUsers;
import sn.unitech.stock.entity.SysUsersId;
import sn.unitech.stock.entity.Taxes;
public class SysEcritsDao<E> extends SysChampDao {
private List <IUniversel> listICro;
private List<Taxes> listTaxes;
private List<Ecritures> listEcritures;
private List<SysEcrits> listSysEcrits;
private IUniversel iCro;
EntityManager em;
private SysEcritsDao() {
}
public SysEcritsDao(List<IUniversel>listICro,List<Taxes> listTaxes,EntityManager em){
this.listICro=listICro;
this.listTaxes=listTaxes;
this.em=em;
Map<Integer,String> map=new LinkedHashMap<Integer,String>();
map.put(0,this.listICro.get(0).getEvents().getSysUsers().getId().getIdAdherent());
map.put(1,this.listICro.get(0).getEvents().getSysEvents().getIdEvent());
this.listSysEcrits=this.getResultList(ReadProperties.getReadProperties().read("SysEcrit.jpqlEcrit"),this.em,map);
this.listEcritures=new ArrayList<Ecritures>();
}
private Compte getCompte(String idCompte){
Compte compte;
compte=(Compte)this.find(Compte.class, idCompte,this.em);
return compte;
}
//definitions des variables du cro
public Compte getCompteFixe(String varCpt){
return this.getCompte(varCpt);
}
public Compte getCptProduit(){
return this.getCompte(this.iCro.getSysProduit().getCompte().getIdCompte());
}
public Compte getCptFournisseur(){
Map<Integer,String> param=new LinkedHashMap<Integer,String>();
param.put(0,this.iCro.getEvents().getCodTiers());
param.put(1,ToolsDao.CATEGORIEFOURNISSEUR);
return (Compte) this.getSingleResult(ReadProperties.getReadProperties().read("SysEcrit.jpqlCptCliFournisseur"), em, param);
}
public Compte getCptCli(){
Map<Integer,String> param=new LinkedHashMap<Integer,String>();
param.put(0,this.iCro.getEvents().getCodTiers());
param.put(1,ToolsDao.CATEGORIECLIENT);
return (Compte) this.getSingleResult(ReadProperties.getReadProperties().read("SysEcrit.jpqlCptCliFournisseur"), em, param);
}
public Compte getCptUser(){
return this.getCompte(this.iCro.getEvents().getSysUsers().getCompte().getIdCompte());
}
public Double getMontant(){
return this.iCro.getPrixTot();
}
public Double getTotMontant(){
return this.iCro.getEvents().getMntTot();
}
//
private String getConventionName(String variableCro){
variableCro=variableCro.substring(0,1).toUpperCase()+variableCro.substring(1,variableCro.length());
return "get"+variableCro;
}
private Object declencher(String methodeName)throws Exception {
Method method=this.getClass().getMethod(methodeName,null);
return method.invoke(this,null);
}
private boolean isCompteFixe(String variableCompte){
try{
Double.parseDouble(variableCompte);
return true;
}
catch(RuntimeException r){return false;}
}
private void getEcritsSchema(int rangProduit,int maxRang) throws Exception {
String varCpt,varMnt;
boolean isSomme;
for (int i=0;i< this.listSysEcrits.size();i++){
isSomme=this.listSysEcrits.get(i).getSysChampByCodChampMnt().getIsSomme().equals("True");
if((!isSomme)||(isSomme && rangProduit==maxRang)){
varCpt=this.listSysEcrits.get(i).getSysChampByCodChampCpt().getIdChamp();
varMnt=this.listSysEcrits.get(i).getSysChampByCodChampMnt().getIdChamp();
Ecritures ecritures=new Ecritures();
if(this.isCompteFixe(varCpt))ecritures.setCompte(getCompteFixe(varCpt));
else ecritures.setCompte((Compte)this.declencher(this.getConventionName(varCpt)));
ecritures.setMontant((Double)this.declencher(this.getConventionName(varMnt)));
ecritures.setSens(this.listSysEcrits.get(i).getSens());
this.listEcritures.add(this.completeEcrits(ecritures));
}
}
}
private void getEcritsTaxes() throws Exception{
for (int i=0;this.listTaxes!=null && i<this.listTaxes.size();i++){
Ecritures ecrituresCtrePartie=new Ecritures();
if(this.isCompteFixe(this.listTaxes.get(i).getCptContrePartie()))
ecrituresCtrePartie.setCompte(getCompteFixe(this.listTaxes.get(i).getCptContrePartie()));
else ecrituresCtrePartie.setCompte((Compte)this.declencher(this.getConventionName(this.listTaxes.get(i).getCptContrePartie())));
ecrituresCtrePartie.setMontant(this.listTaxes.get(i).getValeur());
ecrituresCtrePartie.setSens(this.sensContraire(this.listTaxes.get(i).getSensTaxe()));
this.listEcritures.add(this.completeEcrits(ecrituresCtrePartie));
Ecritures ecrituresTaxe=new Ecritures();
ecrituresTaxe.setCompte(this.getCompteFixe(this.listTaxes.get(i).getCptTaxe()));
ecrituresTaxe.setMontant(this.listTaxes.get(i).getValeur());
ecrituresTaxe.setSens(this.listTaxes.get(i).getSensTaxe());
this.listEcritures.add(this.completeEcrits(ecrituresTaxe));
}
}
private Ecritures completeEcrits(Ecritures ecritures){
ecritures.setLibelle(this.iCro.getEvents().getSysEvents().getIdEvent().trim()+"/ "+ecritures.getCompte().getIntitule().trim());
ecritures.setMntDebit(ecritures.getSens()=='D'? ecritures.getMontant():0);
ecritures.setMntCredit(ecritures.getSens()=='C'? ecritures.getMontant():0);
ecritures.setSysUsers(this.iCro.getEvents().getSysUsers());
EcrituresId ecrituresId=new EcrituresId();
ecrituresId.setIdNumop(this.iCro.getEvents().getIdLot());
ecritures.setId(ecrituresId);
ecritures.setSysDate(ToolsDao.getCurrentDate());
return ecritures;
}
private void getAllEcrits() throws Exception{
for(int i=0;i< this.listICro.size();i++){
this.iCro=this.listICro.get(i);
this.getEcritsSchema(i,this.listICro.size()-1);
}
this.getEcritsTaxes();
}
public EntityManager persistAllEcrits()throws Exception{
this.getAllEcrits();
System.out.println("size ecrits"+this.listEcritures.size());
for (short i=0;i<this.listEcritures.size();i++){
this.listEcritures.get(i).getId().setIdRang(i);
this.persist(this.listEcritures.get(i),this.em);
}
return this.em;
}
public Character sensContraire(Character sens){
if(sens=='C') return 'D';
else return 'C';
}
public static void main(String args[]){
List<DetailEvent> listDetailEvent=new ArrayList<DetailEvent>();
DetailEvent detailEvent=new DetailEvent();
Stock stock=new Stock();
SysProduit sysProduit=new SysProduit();
sysProduit.setCompte(new Compte());
sysProduit.getCompte().setIdCompte("1");
stock.setSysProduit(sysProduit);
detailEvent.setStock(stock);
detailEvent.setEvents(new Events());
detailEvent.getEvents().setMntNet(new Double(100000));
detailEvent.setPrixTot(new Double(40000));
SysUsers sysUsers=new SysUsers();
sysUsers.setCompte(new Compte());
sysUsers.getCompte().setIdCompte("2");
sysUsers.setId(new SysUsersId());
sysUsers.getId().setIdAdherent("1");
detailEvent.getEvents().setSysUsers(sysUsers);
detailEvent.getEvents().setSysEvents(new SysEvents());
detailEvent.getEvents().getSysEvents().setIdEvent("VT");
listDetailEvent.add(detailEvent);
SysEcritsDao sysEcritsDao=new SysEcritsDao(listDetailEvent,new ArrayList(),null);
try {
sysEcritsDao.persistAllEcrits();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("taille liste"+sysEcritsDao.listEcritures.size());
}
}