debut du thread de simulation Wed Aug 17 12:58:10 CEST 2005: Thread[Thread-72,1,main](Memoire libre/Memoire Total = 186346792/314974208)
DBManager database exist ? false
17 aot 2005 12:58:44 - INFO - class fr.ifremer.IsisDBManager est inconnu par wrap.
17 aot 2005 12:58:44 - INFO - class fr.ifremer.xml.XMLEncoderDecoder est inconnu par wrap.
17 aot 2005 12:58:44 - INFO - class fr.ifremer.db.CapturabiliteFactory est inconnu par wrap.
17 aot 2005 12:58:44 - INFO - class fr.ifremer.db.ClassePopulationFactory est inconnu par wrap.
17 aot 2005 12:58:44 - INFO - class fr.ifremer.db.MappingZoneReproZoneRecruFactory est inconnu par wrap.
17 aot 2005 12:58:44 - INFO - class fr.ifremer.db.EmigrationFactory est inconnu par wrap.
17 aot 2005 12:58:44 - INFO - class fr.ifremer.db.EnginFactory est inconnu par wrap.
17 aot 2005 12:58:44 - INFO - class fr.ifremer.db.EspecesCapturablesFactory est inconnu par wrap.
17 aot 2005 12:58:44 - INFO - class fr.ifremer.db.FlotilleFactory est inconnu par wrap.
17 aot 2005 12:58:44 - INFO - class fr.ifremer.db.FormuleFactory est inconnu par wrap.
17 aot 2005 12:58:44 - INFO - class fr.ifremer.db.ImmigrationFactory est inconnu par wrap.
17 aot 2005 12:58:44 - INFO - class fr.ifremer.db.InfoSaisonMetierFactory est inconnu par wrap.
17 aot 2005 12:58:44 - INFO - class fr.ifremer.db.InfoSaisonPopFactory est inconnu par wrap.
17 aot 2005 12:58:44 - INFO - class fr.ifremer.db.MailleFactory est inconnu par wrap.
17 aot 2005 12:58:44 - INFO - class fr.ifremer.db.MetaPopulationFactory est inconnu par wrap.
17 aot 2005 12:58:44 - INFO - class fr.ifremer.db.MetierFactory est inconnu par wrap.
17 aot 2005 12:58:44 - INFO - class fr.ifremer.db.MigrationFactory est inconnu par wrap.
17 aot 2005 12:58:44 - INFO - class fr.ifremer.db.PopulationFactory est inconnu par wrap.
17 aot 2005 12:58:44 - INFO - class fr.ifremer.db.PropChangeFloFactory est inconnu par wrap.
17 aot 2005 12:58:44 - INFO - class fr.ifremer.db.RegionFactory est inconnu par wrap.
17 aot 2005 12:58:45 - INFO - class fr.ifremer.db.RegleGestionFactory est inconnu par wrap.
17 aot 2005 12:58:45 - INFO - class fr.ifremer.db.SecteurFactory est inconnu par wrap.
17 aot 2005 12:58:45 - INFO - class fr.ifremer.db.MetaSecteurFactory est inconnu par wrap.
17 aot 2005 12:58:45 - INFO - class fr.ifremer.db.SecteurSimpleFactory est inconnu par wrap.
17 aot 2005 12:58:45 - INFO - class fr.ifremer.db.SelectiviteFactory est inconnu par wrap.
17 aot 2005 12:58:45 - INFO - class fr.ifremer.db.SimulationFactory est inconnu par wrap.
17 aot 2005 12:58:45 - INFO - class fr.ifremer.db.ScriptObjectFactory est inconnu par wrap.
17 aot 2005 12:58:45 - INFO - class fr.ifremer.db.ScriptMethodFactory est inconnu par wrap.
17 aot 2005 12:58:45 - INFO - class fr.ifremer.db.EffortDescriptionFactory est inconnu par wrap.
17 aot 2005 12:58:45 - INFO - class fr.ifremer.db.PortFactory est inconnu par wrap.
17 aot 2005 12:58:45 - INFO - class fr.ifremer.db.SetOfVesselsFactory est inconnu par wrap.
17 aot 2005 12:58:45 - INFO - class fr.ifremer.db.TripTypeFactory est inconnu par wrap.
17 aot 2005 12:58:45 - INFO - class fr.ifremer.db.VesselTypeFactory est inconnu par wrap.
17 aot 2005 12:58:45 - INFO - class fr.ifremer.db.StrategyFactory est inconnu par wrap.
17 aot 2005 12:58:45 - INFO - class fr.ifremer.db.StrategyMonthInfoFactory est inconnu par wrap.
17 aot 2005 12:58:45 - INFO - class fr.ifremer.db.PropStrMetFactory est inconnu par wrap.
17 aot 2005 12:58:46 - INFO - class fr.ifremer.simulation.SimulationControlLocal est inconnu par wrap.
17 aot 2005 12:58:46 - INFO - class fr.ifremer.nodb.Date est inconnu par wrap.
17 aot 2005 12:58:46 - INFO - class fr.ifremer.simulation.SiMatrice2Optimisation est inconnu par wrap.
17 aot 2005 12:58:46 - INFO - class fr.ifremer.simulation.GravityModelOptimisation est inconnu par wrap.
FESI.Exceptions.EcmaScriptParseException: Syntax error detected near line 313, column 9, after <IDENTIFIER>
in string starting with: 'function CantonnementAnnee(param){'...
17 aot 2005 12:58:46 - WARNING - La simulation a chou
Erreur durant la creation de la simualtion resultat.
fr.ifremer.simulator.SimulationException: Erreur durant la creation de la simualtion resultat.
	at fr.ifremer.simulator.Simulator.simulate(Simulator.java:308)
	at fr.ifremer.SimulationThread.runLocalSimulation(SimulationThread.java:295)
	at fr.ifremer.SimulationThread.runSimulation(SimulationThread.java:384)
	at fr.ifremer.SimulationThread.runSimulationAndExport(SimulationThread.java:416)
	at fr.ifremer.SimulationThread.run(SimulationThread.java:266)
Caused by: org.codelutin.ecmascript.ECMAScriptException: Erreur lors de l'evaluation du code:function CantonnementAnnee(param){
var StringBuffer = Packages.java.lang.StringBuffer;
var Date = Packages.fr.ifremer.nodb.Date;
var XMLUtil = Packages.org.codelutin.xml.XMLUtil;

this.param = param;

//construction de p
this.p = new Object();
this.p.paramRegle = this.param;
//la zone de fermeture
this.p.zone= this.param.getValue("zone");
writeln("zone:"+this.p.zone);
//les mailles du secteur de fermeture
this.p.mailles = this.p.zone.getMaille();

this.p.dateDeb=this.param.getValue("dateDeb");
this.p.dateFin=this.param.getValue("dateFin");

this.p.moisDeb=this.param.getValue("moisDeb");
this.p.moisFin=this.param.getValue("moisFin");
this.p.engin=this.param.getValue("engin");

}

function CantonnementAnnee_parametre(date,metier,suivie,gestionMetier){
this.p.metier = metier;
this.p.date = date;
this.p.suivie = suivie;
this.p.gestionMetier = gestionMetier;

}

CantonnementAnnee.prototype.parametre = CantonnementAnnee_parametre;
function CantonnementAnnee_condition(p, oldValue){
writeln("condition fermeture zone");
var mois = p.date.getMois().getNumMois();
writeln("mois:"+mois);
if(!(p.moisDeb<=mois && mois<=p.moisFin))
  return false;
writeln("on est dans l'espace des mois possible");
//on est dans l'espace des mois possible
if(p.date.before(p.dateDeb))
  return false;
if(p.date.after(p.dateFin))
  return false;
if (!p.metier.getEngin().equals(p.engin)) 
  return false;

var mailleMetier = p.metier.getSecteurMois(p.date.getMois()).getMaille();

// s'il y a une intersection avec la zone ferme, alors la regle s'applique
mailleMetier.retainAll(p.mailles)
var result = mailleMetier.size() != 0;

if(result)
  writeln("===== Fermeture Zone s'applique ======");
return result;

}

CantonnementAnnee.prototype.condition = CantonnementAnnee_condition;
function CantonnementAnnee_actionAvant(p){
writeln("Cantonnement zone Action avant metier:"+p.metier);
writeln("Les mailles fermees sont:"+p.mailles);

var zoneMetier = p.metier.getSecteurMois(p.date.getMois());
var mailleMetier = zoneMetier.getMaille().copy();
mailleMetier.removeAll(p.mailles);
writeln("inter maille:"+mailleMetier.size());
// test pour savoir si toute la zone de pratique du metier
// (reunion de toutes les zones metiers  de metier a date)
// est totalement incluse dans la zone Cantonnement
if (mailleMetier.size() != 0){ //le cas intersection.length==mailleMetier est dans condition
  // si toute la zone de pratique du metier n'est pas incluse dans zone Cantonnement

  //creation du nouveau secteur de metier
  var secteurResult = MetaSecteurFactory.create("MetaCantonnement-"+p.metier.getNom()+"-"+date.getDate(), p.metier.getRegion(), "Secteur creer durant la simulation.");
  writeln("nouveau secteur cree:"+secteurResult);
  var zonesMetier = zoneMetier.getAllSecteur();
  writeln("zonesMetier:"+zonesMetier);
  writeln("zonesMetier.size:"+zonesMetier.size());

  for(var i=0; i<zonesMetier.size(); i++){
    var zonemet = zonesMetier.get(i);
    writeln("zonemet:"+zonemet);
    // intersection entre la zeme zone metier a date et zone de Cantonnement
    var listemailleszonemetier = zonemet.getMaille().copy();
    var nbMailleZoneMetier = listemailleszonemetier.size();
    writeln("maille metier:"+listemailleszonemetier);
    writeln("maille Cantonnement:"+p.mailles);
    listemailleszonemetier.removeAll(p.mailles);
    if(0==listemailleszonemetier.size()){
      //si completement inclus on le supprime
      //donc on ne le met pas dans le nouveau
      writeln("on supprime la zone"+zonemet);
    }
    else if (listemailleszonemetier.size() != nbMailleZoneMetier) {
      // si la zone metier n'est pas totalement incluse dans zone de Cantonnement
      // on reduit  la zeme zone metier de cette intersection
      // pas de modif de la matrice de proportion strmet
      writeln("on cree une nouvelle zone a partir de:"+zonemet+" avec "+listemailleszonemetier);
      var simpleSecteur = SecteurSimpleFactory.create("Cantonnement-"+p.metier.getNom()+"-"+zonemet+"-"+date.getDate(), p.metier.getRegion(), "Secteur creer durant la simulation.");
      simpleSecteur.addAllMaille(listemailleszonemetier);
      secteurResult.addSecteur(simpleSecteur);
     writeln("apres addSecteur");  
  }else {
      //sinon on le met dans le nouveau
      writeln("On remet tel quelle la zone:"+zonemet);
      secteurResult.addSecteur(zonemet);
    }
  }// fin du for sur les zone metier de la zone de pratique du metier
  writeln("Zone metier avant"+zoneMetier.getMaille());
  writeln("Zone metier apres"+secteurResult);
  writeln("Zone metier apres"+secteurResult.getMaille());
  p.metier.setSecteurMois(secteurResult, p.date.getMois());
}  
else {
  writeln("Toute la zone metier est ferme");
  // sinon toute la zone de pratique du metier est incluse dans zone Cantonnement
  // alors metier devient metier-nonactivite
      
  //listes des strategies contenant ce metier et tel que strmet(metier,date)!=0
  var listMetiers = db.oql("select * from fr.ifremer.db.StrMetFactory where metier=? and proportion!=0",
    (new DBArgument()).add(p.metier));

  writeln("");

  var listestrategiesdemetier = new DBUniqueCollection(StrategieFactory);
  for(var i=0; i<listMetiers.size(); i++)
     listestrategiesdemetier.add(listMetiers.get(i).getStrategie());

  writeln("Resultat de la requete:"+listestrategiesdemetier);
  var metChomage = MetierFactory.findByKey("nonActivite", p.metier.getRegion());
  writeln("Metier nonActivite:"+metChomage);
  for (var s=0; s<listestrategiesdemetier.size(); s++){
    var strategie = listestrategiesdemetier.get(s);
    writeln("debut pour str:"+strategie);
    var strMet = StrategyMonthInfo.findByKey(strategie, p.metier, p.date.getMois());
    writeln("strmet:"+strMet);
    var strMetChomage = StrategyMonthInfo.findByKey(strategie, metChomage, p.date.getMois());
    writeln("strmet chomage:"+strMetChomage);
    strMetChomage.setProportion(strMetChomage.getProportion()+strMet.getProportion());
    strMet.setProportion(0);
    writeln("fin pour str:"+strategie);
  }
}// fin du else passage a metier-nonactivite
writeln("fin Cantonnement zone action avant");
return p.gestionMetier;

}

CantonnementAnnee.prototype.actionAvant = CantonnementAnnee_actionAvant;
function CantonnementAnnee_actionApres(p){
writeln("Action apres");
return p.gestionMetier;
}

CantonnementAnnee.prototype.actionApres = CantonnementAnnee_actionApres;
function CantonnementSemestre1(param){
var StringBuffer = Packages.java.lang.StringBuffer;
var Date = Packages.fr.ifremer.nodb.Date;
var XMLUtil = Packages.org.codelutin.xml.XMLUtil;

this.param = param;

//construction de p
this.p = new Object();
this.p.paramRegle = this.param;
//la zone de fermeture
this.p.zone= this.param.getValue("zone");
writeln("zone:"+this.p.zone);
//les mailles du secteur de fermeture
this.p.mailles = this.p.zone.getMaille();

this.p.dateDeb=this.param.getValue("dateDeb");
this.p.dateFin=this.param.getValue("dateFin");

this.p.moisDeb=this.param.getValue("moisDeb");
this.p.moisFin=this.param.getValue("moisFin");
this.p.engin=this.param.getValue("engin");
}

function CantonnementSemestre1_parametre(date,metier,suivie,gestionMetier){
this.p.metier = metier;
this.p.date = date;
this.p.suivie = suivie;
this.p.gestionMetier = gestionMetier;

}

CantonnementSemestre1.prototype.parametre = CantonnementSemestre1_parametre;
function CantonnementSemestre1_condition(p, oldValue){
writeln("condition fermeture zone");
var mois = p.date.getMois().getNumMois();
writeln("mois:"+mois);
if(!(p.moisDeb<=mois && mois<=p.moisFin))
  return false;
writeln("on est dans l'espace des mois possible");
//on est dans l'espace des mois possible
if(p.date.before(p.dateDeb))
  return false;
if(p.date.after(p.dateFin))
  return false;
if (!p.metier.getEngin().equals(p.engin)) 
  return false;

var mailleMetier = p.metier.getSecteurMois(p.date.getMois()).getMaille();

// s'il y a une intersection avec la zone ferme, alors la regle s'applique
mailleMetier.retainAll(p.mailles)
var result = mailleMetier.size() != 0;

if(result)
  writeln("===== Fermeture Zone s'applique ======");
return result;

}

CantonnementSemestre1.prototype.condition = CantonnementSemestre1_condition;
function CantonnementSemestre1_actionAvant(p){
writeln("Cantonnement zone Action avant metier:"+p.metier);
writeln("Les mailles fermees sont:"+p.mailles);

var zoneMetier = p.metier.getSecteurMois(p.date.getMois());
var mailleMetier = zoneMetier.getMaille().copy();
mailleMetier.removeAll(p.mailles);
writeln("inter maille:"+mailleMetier.size());
// test pour savoir si toute la zone de pratique du metier
// (reunion de toutes les zones metiers  de metier a date)
// est totalement incluse dans la zone Cantonnement
if (mailleMetier.size() != 0){ //le cas intersection.length==mailleMetier est dans condition
  // si toute la zone de pratique du metier n'est pas incluse dans zone Cantonnement

  //creation du nouveau secteur de metier
  var secteurResult = MetaSecteurFactory.create("MetaCantonnement-"+p.metier.getNom()+"-"+date.getDate(), p.metier.getRegion(), "Secteur creer durant la simulation.");
  writeln("nouveau secteur cree:"+secteurResult);
  var zonesMetier = zoneMetier.getAllSecteur();
  writeln("zonesMetier:"+zonesMetier);
  writeln("zonesMetier.size:"+zonesMetier.size());

  for(var i=0; i<zonesMetier.size(); i++){
    var zonemet = zonesMetier.get(i);
    writeln("zonemet:"+zonemet);
    // intersection entre la zeme zone metier a date et zone de Cantonnement
    var listemailleszonemetier = zonemet.getMaille().copy();
    var nbMailleZoneMetier = listemailleszonemetier.size();
    writeln("maille metier:"+listemailleszonemetier);
    writeln("maille Cantonnement:"+p.mailles);
    listemailleszonemetier.removeAll(p.mailles);
    if(0==listemailleszonemetier.size()){
      //si completement inclus on le supprime
      //donc on ne le met pas dans le nouveau
      writeln("on supprime la zone"+zonemet);
    }
    else if (listemailleszonemetier.size() != nbMailleZoneMetier) {
      // si la zone metier n'est pas totalement incluse dans zone de Cantonnement
      // on reduit  la zeme zone metier de cette intersection
      // pas de modif de la matrice de proportion strmet
      writeln("on cree une nouvelle zone a partir de:"+zonemet+" avec "+listemailleszonemetier);
      var simpleSecteur = SecteurSimpleFactory.create("Cantonnement-"+p.metier.getNom()+"-"+zonemet+"-"+date.getDate(), p.metier.getRegion(), "Secteur creer durant la simulation.");
      simpleSecteur.addAllMaille(listemailleszonemetier);
      secteurResult.addSecteur(simpleSecteur);
     writeln("apres addSecteur");  
  }else {
      //sinon on le met dans le nouveau
      writeln("On remet tel quelle la zone:"+zonemet);
      secteurResult.addSecteur(zonemet);
    }
  }// fin du for sur les zone metier de la zone de pratique du metier
  writeln("Zone metier avant"+zoneMetier.getMaille());
  writeln("Zone metier apres"+secteurResult);
  writeln("Zone metier apres"+secteurResult.getMaille());
  p.metier.setSecteurMois(secteurResult, p.date.getMois());
}  
else {
  writeln("Toute la zone metier est ferme");
  // sinon toute la zone de pratique du metier est incluse dans zone Cantonnement
  // alors metier devient metier-nonactivite
      
  //listes des strategies contenant ce metier et tel que strmet(metier,date)!=0
  var listMetiers = db.oql("select * from fr.ifremer.db.StrMetFactory where metier=? and proportion!=0",
    (new DBArgument()).add(p.metier));

  writeln("");

  var listestrategiesdemetier = new DBUniqueCollection(StrategieFactory);
  for(var i=0; i<listMetiers.size(); i++)
     listestrategiesdemetier.add(listMetiers.get(i).getStrategie());

  writeln("Resultat de la requete:"+listestrategiesdemetier);
  var metChomage = MetierFactory.findByKey("nonActivite", p.metier.getRegion());
  writeln("Metier nonActivite:"+metChomage);
  for (var s=0; s<listestrategiesdemetier.size(); s++){
    var strategie = listestrategiesdemetier.get(s);
    writeln("debut pour str:"+strategie);
    var strMet = StrategyMonthInfo.findByKey(strategie, p.metier, p.date.getMois());
    writeln("strmet:"+strMet);
    var strMetChomage = StrategyMonthInfo.findByKey(strategie, metChomage, p.date.getMois());
    writeln("strmet chomage:"+strMetChomage);
    strMetChomage.setProportion(strMetChomage.getProportion()+strMet.getProportion());
    strMet.setProportion(0);
    writeln("fin pour str:"+strategie);
  }
}// fin du else passage a metier-nonactivite
writeln("fin Cantonnement zone action avant");
return p.gestionMetier;

}

CantonnementSemestre1.prototype.actionAvant = CantonnementSemestre1_actionAvant;
function CantonnementSemestre1_actionApres(p){
turePrin"Action apres");
return p.gestionMetier;
}

CantonnementSemestre1.prototype.actionApres = CantonnementSemestre1_actionApres;
function CantonnementSemestre2(param){
var StringBuffer = Packages.java.lang.StringBuffer;
var Date = Packages.fr.ifremer.nodb.Date;
var XMLUtil = Packages.org.codelutin.xml.XMLUtil;

this.param = param;

//construction de p
this.p = new Object();
this.p.paramRegle = this.param;
//la zone de fermeture
this.p.zone= this.param.getValue("zone");
writeln("zone:"+this.p.zone);
//les mailles du secteur de fermeture
this.p.mailles = this.p.zone.getMaille();

this.p.dateDeb=this.param.getValue("dateDeb");
this.p.dateFin=this.param.getValue("dateFin");

this.p.moisDeb=this.param.getValue("moisDeb");
this.p.moisFin=this.param.getValue("moisFin");
this.p.engin=this.param.getValue("engin");
}

function CantonnementSemestre2_parametre(date,metier,suivie,gestionMetier){
this.p.metier = metier;
this.p.date = date;
this.p.suivie = suivie;
this.p.gestionMetier = gestionMetier;

}

CantonnementSemestre2.prototype.parametre = CantonnementSemestre2_parametre;
function CantonnementSemestre2_condition(p, oldValue){
writeln("condition fermeture zone");
var mois = p.date.getMois().getNumMois();
writeln("mois:"+mois);
if(!(p.moisDeb<=mois && mois<=p.moisFin))
  return false;
writeln("on est dans l'espace des mois possible");
//on est dans l'espace des mois possible
if(p.date.before(p.dateDeb))
  return false;
if(p.date.after(p.dateFin))
  return false;
if (!p.metier.getEngin().equals(p.engin)) 
  return false;

var mailleMetier = p.metier.getSecteurMois(p.date.getMois()).getMaille();

// s'il y a une intersection avec la zone ferme, alors la regle s'applique
mailleMetier.retainAll(p.mailles)
var result = mailleMetier.size() != 0;

if(result)
  writeln("===== Fermeture Zone s'applique ======");
return result;

}

CantonnementSemestre2.prototype.condition = CantonnementSemestre2_condition;
function CantonnementSemestre2_actionAvant(p){
writeln("Cantonnement zone Action avant metier:"+p.metier);
writeln("Les mailles fermees sont:"+p.mailles);

var zoneMetier = p.metier.getSecteurMois(p.date.getMois());
var mailleMetier = zoneMetier.getMaille().copy();
mailleMetier.removeAll(p.mailles);
writeln("inter maille:"+mailleMetier.size());
// test pour savoir si toute la zone de pratique du metier
// (reunion de toutes les zones metiers  de metier a date)
// est totalement incluse dans la zone Cantonnement
if (mailleMetier.size() != 0){ //le cas intersection.length==mailleMetier est dans condition
  // si toute la zone de pratique du metier n'est pas incluse dans zone Cantonnement

  //creation du nouveau secteur de metier
  var secteurResult = MetaSecteurFactory.create("MetaCantonnement-"+p.metier.getNom()+"-"+date.getDate(), p.metier.getRegion(), "Secteur creer durant la simulation.");
  writeln("nouveau secteur cree:"+secteurResult);
  var zonesMetier = zoneMetier.getAllSecteur();
  writeln("zonesMetier:"+zonesMetier);
  writeln("zonesMetier.size:"+zonesMetier.size());

  for(var i=0; i<zonesMetier.size(); i++){
    var zonemet = zonesMetier.get(i);
    writeln("zonemet:"+zonemet);
    // intersection entre la zeme zone metier a date et zone de Cantonnement
    var listemailleszonemetier = zonemet.getMaille().copy();
    var nbMailleZoneMetier = listemailleszonemetier.size();
    writeln("maille metier:"+listemailleszonemetier);
    writeln("maille Cantonnement:"+p.mailles);
    listemailleszonemetier.removeAll(p.mailles);
    if(0==listemailleszonemetier.size()){
      //si completement inclus on le supprime
      //donc on ne le met pas dans le nouveau
      writeln("on supprime la zone"+zonemet);
    }
    else if (listemailleszonemetier.size() != nbMailleZoneMetier) {
      // si la zone metier n'est pas totalement incluse dans zone de Cantonnement
      // on reduit  la zeme zone metier de cette intersection
      // pas de modif de la matrice de proportion strmet
      writeln("on cree une nouvelle zone a partir de:"+zonemet+" avec "+listemailleszonemetier);
      var simpleSecteur = SecteurSimpleFactory.create("Cantonnement-"+p.metier.getNom()+"-"+zonemet+"-"+date.getDate(), p.metier.getRegion(), "Secteur creer durant la simulation.");
      simpleSecteur.addAllMaille(listemailleszonemetier);
      secteurResult.addSecteur(simpleSecteur);
     writeln("apres addSecteur");  
  }else {
      //sinon on le met dans le nouveau
      writeln("On remet tel quelle la zone:"+zonemet);
      secteurResult.addSecteur(zonemet);
    }
  }// fin du for sur les zone metier de la zone de pratique du metier
  writeln("Zone metier avant"+zoneMetier.getMaille());
  writeln("Zone metier apres"+secteurResult);
  writeln("Zone metier apres"+secteurResult.getMaille());
  p.metier.setSecteurMois(secteurResult, p.date.getMois());
}  
else {
  writeln("Toute la zone metier est ferme");
  // sinon toute la zone de pratique du metier est incluse dans zone Cantonnement
  // alors metier devient metier-nonactivite
      
  //listes des strategies contenant ce metier et tel que strmet(metier,date)!=0
  var listMetiers = db.oql("select * from fr.ifremer.db.StrMetFactory where metier=? and proportion!=0",
    (new DBArgument()).add(p.metier));

  writeln("");

  var listestrategiesdemetier = new DBUniqueCollection(StrategieFactory);
  for(var i=0; i<listMetiers.size(); i++)
     listestrategiesdemetier.add(listMetiers.get(i).getStrategie());

  writeln("Resultat de la requete:"+listestrategiesdemetier);
  var metChomage = MetierFactory.findByKey("nonActivite", p.metier.getRegion());
  writeln("Metier nonActivite:"+metChomage);
  for (var s=0; s<listestrategiesdemetier.size(); s++){
    var strategie = listestrategiesdemetier.get(s);
    writeln("debut pour str:"+strategie);
    var strMet = StrategyMonthInfo.findByKey(strategie, p.metier, p.date.getMois());
    writeln("strmet:"+strMet);
    var strMetChomage = StrategyMonthInfo.findByKey(strategie, metChomage, p.date.getMois());
    writeln("strmet chomage:"+strMetChomage);
    strMetChomage.setProportion(strMetChomage.getProportion()+strMet.getProportion());
    strMet.setProportion(0);
    writeln("fin pour str:"+strategie);
  }
}// fin du else passage a metier-nonactivite
writeln("fin Cantonnement zone action avant");
return p.gestionMetier;

}

CantonnementSemestre2.prototype.actionAvant = CantonnementSemestre2_actionAvant;
function CantonnementSemestre2_actionApres(p){
writeln("Action apres");
return p.gestionMetier;
}

CantonnementSemestre2.prototype.actionApres = CantonnementSemestre2_actionApres;
function ChangementParamControlableZone(param){
var StringBuffer = Packages.java.lang.StringBuffer;
var Date = Packages.fr.ifremer.nodb.Date;
var XMLUtil = Packages.org.codelutin.xml.XMLUtil;

this.param = param;

//construction de p
this.p = new Object();
this.p.paramRegle = this.param;

//la zone d'application du ChtParamControlable
this.p.zone= this.param.getValue("zone");
writeln("zone:"+this.p.zone);

//les mailles de la zone d'application du ChtParamControal
this.p.mailles = this.p.zone.getMaille();

this.p.dateDeb=this.param.getValue("dateDeb");
this.p.dateFin=this.param.getValue("dateFin");

this.p.moisDeb=this.param.getValue("moisDeb");
this.p.moisFin=this.param.getValue("moisFin");

//l'engin affecte par le mesure
//nouvel engin (=engin si la nouvelle valeur sort de la gamme d'engin)
// et la nouvelle valeur du parametre controlable
this.p.engin=this.param.getValue("engin");
this.p.nouvelEngin=this.param.getValue("nouvelEngin");
this.p.valParam=this.param.getValue("valParam");

}

function ChangementParamControlableZone_parametre(date,metier,suivie,gestionMetier){
//metier courant de la boucle sur les metiers
this.p.metier = metier;
//date courante
this.p.date = date;
//vecteurs des parametres courants de chaque pop : effectifs, captures, rejets,...
// fr.ifremer.Simulation.Simulationsuivi
this.p.suivie = suivie;
// ensemble de metiers modifies et affectes a des groupes (cf maude pour Licence)
this.p.gestionMetier = gestionMetier;
}

ChangementParamControlableZone.prototype.parametre = ChangementParamControlableZone_parametre;
function ChangementParamControlableZone_condition(p, oldValue){
writeln("condition fermeture zone");
var mois = p.date.getMois().getNumMois();
writeln("mois:"+mois);
if(!(p.moisDeb<=mois && mois<=p.moisFin))
  return false;
writeln("on est dans l'espace des mois possible");
//on est dans l'espace des mois possible
if(p.date.before(p.dateDeb))
  return false;
if(p.date.after(p.dateFin))
  return false;

//s'il utilise le meme engin
if (!p.metier.getEngin().equals(p.engin)) 
  return false;

//bug
/**
writeln("***** C peut-etre vrai:"+p.mailles +"*"+ p.metier+"*"+p.date);
if (p.metier.getCommentaire() == "Metier cree pdt simu"){
  var list = MetierFactory.getDependObjectList(p.metier);
  db.removeAll(list);
  return false;
}
**/
//fin bug

// s'il y a une intersection avec la zone de chtdeparam, alors la regle s'applique
var mailleMetier = p.metier.getSecteurMois(p.date.getMois()).getMaille();
mailleMetier.retainAll(p.mailles)
var result = mailleMetier.size() != 0;


if(result)
  writeln("===== ChangementParamControlable s'applique ======");
return result;
}

ChangementParamControlableZone.prototype.condition = ChangementParamControlableZone_condition;
function ChangementParamControlableZone_actionAvant(p){
writeln("ChangementParamControlable Action avant metier:"+p.metier);
writeln("L'engin affecte est:"+p.engin);
writeln("La valeur du parametre controlable est:"+p.valParam);

var UTJour = Packages.fr.ifremer.nodb.UTJour;
var Saison = Packages.fr.ifremer.nodb.Saison;

//mailles de zone
var mailleZones = p.zone.getMaille();
// zone de pratique de metier
var zpratMet = p.metier.getSecteurMois(p.date.getMois());
// zones metiers dans la zone de pratique de metier
var zmMets = zpratMet.getAllSecteur();
//valeur du parametre controlable avant mesure
var val = p.metier.getValeurParamControlable();
// Especes capturables de InfoSaison metier avant mesure
var espCapturables = p.metier.getInfoSaisonMois(p.date.getMois()).getEspecesCaptu();

  //modification de metier et creation d'un nouveau metier
  //avec metier.zone = reunion des zm de metier qui ont une intersection non vide avec zone
  //     metier.engin = nouvelEngin
  //     metier.valeurParamControlable= valParam
  //avec nouveauMetier.zone = reunion des zm de metier qui ont une intersection vide avec zone
  // et le reste inchange

  
  //recherche des zones metier de zmmets ayant une intersection non vide avec zone
  //et de celles ayant une intersection vide
  var zmMetModifies = new DBCollection(SecteurFactory);
  var zmMetNouveaus = new DBCollection(SecteurFactory);
  for (var j=0; j<zmMets.size(); j++) {
    var zm = zmMets.get(j);
    var mailleZonesCopie = mailleZones.copy();
    mailleZonesCopie.retainAll(zm.getMaille());
    if (mailleZonesCopie.size()!=0)  
      zmMetModifies.add(zm); // intersection non vide : metierModifie
    else 
      zmMetNouveaus.add(zm); // intersection vide : metierNouveau
  }// fin de for j (collections des zones metier)



  //modification de metier
  //construction de la zone de pratique de  metier Modifie
  var zpratMetModifie = MetaSecteurFactory.create("MetaChtParamControlZone-"+p.metier.getNom()+"-"+p.date.getDate(),p.metier.getRegion(),"Secteur cree pdt simu");
  zpratMetModifie.addAllSecteur(zmMetModifies);
  // modification de metier
  p.metier.setSecteurMois(zpratMetModifie,p.date.getMois());
  p.metier.setEngin(p.nouvelEngin);
  p.metier.setValeurParamControlable(p.valParam);
  // preparation du calcul de la nouvelle proportion d'effort dans la strategie 
  var nbMailleZpratMet = p.metier.getSecteurMois(p.date.getMois()).getMaille().size();
  var nbMailleZpratMetModifie = zpratMetModifie.getMaille().size();


  //creation si besoin du nouveau metier
  if (zmMetNouveaus.size()!=0){
    // creation de la zone pratique du nouveau metier
    var zpratMetNouveau = MetaSecteurFactory.create("MetaChtParamControl-"+p.metier.getNom()+"-"+p.date.getDate(),
                                                     p.metier.getRegion(),"Secteur cree pdt simu");
    zpratMetNouveau.addAllSecteur(zmMetNouveaus);
    // calcul de la nouvelle proportion d'effort dans la strategie 
    var nbMailleZpratMetNouveau = zpratMetNouveau.getMaille().size();
   
    // creation de nouveau metier identique a metier avant mesure sauf pour sa zone de pratique
    var metNouveau = MetierFactory.create(p.metier.getNom()+"-ChtParamControlZone-"+p.date.getDate(),
                                          p.metier.getRegion(),p.engin, val,
                                          p.metier.getNbOperationMax(), "Metier cree pdt simu");
    // temps de route mis a 1
    var infoSaisonMetNouveau = InfoSaisonMetierFactory.create(metNouveau, new Saison(0,11),new UTJour(1), zpratMetNouveau,"InfoSaison cree pdt simu");
    for (var i=0; i<espCapturables.size(); i++){
      var espCapt = espCapturables.get(i);
      EspecesCapturablesFactory.create(infoSaisonMetNouveau, espCapt.getMetaPopulation(), espCapt.getFacteurCiblage(), 
                                       espCapt.getCapturePrimaire(),"")
    }
 
   }
 

//modification des proportion de strmet pour chaque strategie contenant metier
// strategies auxquelles metier appartient
var strMets = StrategyMonthInfo.findAllByMetier(p.metier);
var strMets = db.oql("select * from fr.ifremer.db.StrMetFactory where metier = ? and mois = ?",
  (new DBArgument()).add(p.metier).add(p.date.getMois().getNumMois()))

//pour chaque strategie contenant metier
for( var i=0; i<strMets.size(); i++){
  var strategy = strMets.get(i).getStrategie();
  
  //modif pour metier Modifie
  var strMet = StrategyMonthInfo.findByKey(strategy,p.metier,p.date.getMois());
  //str(metier) = [str(metier)/NbCell(metier.zone)]*NbCell(zpratMetModifie)
  var proportionMetModifie = (strMet.getProportion() / nbMailleZpratMet)*nbMailleZpratMetModifie;
  strMet.setProportion(proportionMetModifie);

  //modif si besoin pour metier Nouveau
  if (zmMetNouveaus.size()!=0){
    //str(metier) = [str(metier)/NbCell(metier.zone)]*NbCell(zpratMetNouveau)
    var proportionMetNouveau = (strMet.getProportion() / nbMailleZpratMet)*nbMailleZpratMetNouveau;
    writeln("strmet "+i+":"+strategy+"*"+metNouveau+"*"+p.date.getMois());
    var strMetNouveau = StrategyMonthInfo.create(strategy,metNouveau,p.date.getMois(),proportionMetNouveau,
                                             "strmet cree pdt simu")
  }

} // fin de for i 


writeln("fin ChangementParamControlable action avant");
return p.gestionMetier;
}

ChangementParamControlableZone.prototype.actionAvant = ChangementParamControlableZone_actionAvant;
function ChangementParamControlableZone_actionApres(p){
writeln("Action apres");
return p.gestionMetier;
}

ChangementParamControlableZone.prototype.actionApres = ChangementParamControlableZone_actionApres;
function ChangementParamControlableZoneGlobal(param){
var StringBuffer = Packages.java.lang.StringBuffer;
var Date = Packages.fr.ifremer.nodb.Date;
var XMLUtil = Packages.org.codelutin.xml.XMLUtil;

this.param = param;

//construction de p
this.p = new Object();
this.p.paramRegle = this.param;

//la zone d'application du ChtParamControlable
this.p.zone= this.param.getValue("zone");
writeln("zone:"+this.p.zone);

//les mailles de la zone d'application du ChtParamControal
this.p.mailles = this.p.zone.getMaille();

this.p.dateDeb=this.param.getValue("dateDeb");
this.p.dateFin=this.param.getValue("dateFin");

this.p.moisDeb=this.param.getValue("moisDeb");
this.p.moisFin=this.param.getValue("moisFin");

//l'engin affecte par le mesure
//nouvel engin (=engin si la nouvelle valeur sort de la gamme d'engin)
// et la nouvelle valeur du parametre controlable
this.p.engin=this.param.getValue("engin");
this.p.nouvelEngin=this.param.getValue("nouvelEngin");
this.p.valParam=this.param.getValue("valParam");


}

function ChangementParamControlableZoneGlobal_parametre(date,metier,suivie,gestionMetier){
//metier courant de la boucle sur les metiers
this.p.metier = metier;
//date courante
this.p.date = date;
//vecteurs des parametres courants de chaque pop : effectifs, captures, rejets,...
// fr.ifremer.Simulation.Simulationsuivi
this.p.suivie = suivie;
// ensemble de metiers modifies et affectes a des groupes (cf maude pour Licence)
this.p.gestionMetier = gestionMetier;

}

ChangementParamControlableZoneGlobal.prototype.parametre = ChangementParamControlableZoneGlobal_parametre;
function ChangementParamControlableZoneGlobal_condition(p, oldValue){
writeln("condition fermeture zone");
var mois = p.date.getMois().getNumMois();
writeln("mois:"+mois);
if(!(p.moisDeb<=mois && mois<=p.moisFin))
  return false;
writeln("on est dans l'espace des mois possible");
//on est dans l'espace des mois possible
if(p.date.before(p.dateDeb))
  return false;
if(p.date.after(p.dateFin))
  return false;

//s'il utilise le meme engin
if (!p.metier.getEngin().equals(p.engin)) 
  return false;

// s'il y a une intersection avec la zone de chtdeparam, alors la regle s'applique
var mailleMetier = p.metier.getSecteurMois(p.date.getMois()).getMaille();
mailleMetier.retainAll(p.mailles)
var result = mailleMetier.size() != 0;


if(result)
  writeln("===== ChangementParamControlable s'applique ======");
return result;

}

ChangementParamControlableZoneGlobal.prototype.condition = ChangementParamControlableZoneGlobal_condition;
function ChangementParamControlableZoneGlobal_actionAvant(p){
writeln("ChangementParamControlable Action avant metier:"+p.metier);
writeln("L'engin affecte est:"+p.engin);

writeln("La valeur du parametre controlable est:"+p.valParam);

//modification de metier 
//avec metier.engin = nouvelEngin
// et metier.val=valParam
// et le reste inchange
 p.metier.setEngin(p.nouvelEngin);
 p.metier.setValeurParamControlable(p.valParam);


writeln("fin ChangementParamControlable action avant");
return p.gestionMetier;
}

ChangementParamControlableZoneGlobal.prototype.actionAvant = ChangementParamControlableZoneGlobal_actionAvant;
function ChangementParamControlableZoneGlobal_actionApres(p){
writeln("Action apres");
return p.gestionMetier;
}

ChangementParamControlableZoneGlobal.prototype.actionApres = ChangementParamControlableZoneGlobal_actionApres;
function Economie(param){
this.param = param;

//construction de p
this.p = new Object();
this.p.paramRegle = this.param;

}

function Economie_parametre(date,metier,suivie,gestionMetier){
this.p.date = date;
this.p.suivie = suivie;
this.p.gestionMetier = gestionMetier;

}

Economie.prototype.parametre = Economie_parametre;
function Economie_condition(p, oldValue){
return true;
}

Economie.prototype.condition = Economie_condition;
function Economie_actionAvant(p){
return p.gestionMetier;

}

Economie.prototype.actionAvant = Economie_actionAvant;
function Economie_actionApres(p){
var resManager = control.getResultatManager();
resManager.addResult(date, GravityModel.matriceGrossValueOfLandingsPerSpeciesPerStrategyMet(date));
resManager.addResult(date, GravityModel.matriceNetValueOfLandings(date));
resManager.addResult(date, GravityModel.matriceFishingTimePerMonth(date));
resManager.addResult(date, GravityModel.matriceFuelCostsOfTravel(date));
resManager.addResult(date, GravityModel.matriceCostsOfFishing(date));
resManager.addResult(date, GravityModel.matriceFuelCosts(date));
resManager.addResult(date, GravityModel.matriceRepairAndMaintenanceGearCosts(date));
resManager.addResult(date, GravityModel.matriceOtherRunningCosts(date));
resManager.addResult(date, GravityModel.matriceSharedCosts(date));
resManager.addResult(date, GravityModel.matriceNetRenevueToShare(date));
resManager.addResult(date, GravityModel.matriceCrewShare(date));
resManager.addResult(date, GravityModel.matriceOwnerMarginOverVariableCosts(date));
resManager.addResult(date, GravityModel.matriceVesselMarginOverVariableCosts(date));
resManager.addResult(date, GravityModel.matriceOwnerMarginOverVariableCostsSumOverMetier(date));
resManager.addResult(date, GravityModel.matriceVesselMarginOverVariableCostsSumOverMetier(date));

return p.gestionMetier;

}

Economie.prototype.actionApres = Economie_actionApres;
function FermetureZone(param){
var StringBuffer = Packages.java.lang.StringBuffer;
var Date = Packages.fr.ifremer.nodb.Date;
var XMLUtil = Packages.org.codelutin.xml.XMLUtil;

this.param = param;

//construction de p
this.p = new Object();
this.p.paramRegle = this.param;
//la zone de fermeture
this.p.zone= this.param.getValue("zone");
writeln("zone:"+this.p.zone);
//les mailles du secteur de fermeture
this.p.mailles = this.p.zone.getMaille();

this.p.dateDeb=this.param.getValue("dateDeb");
this.p.dateFin=this.param.getValue("dateFin");

this.p.moisDeb=this.param.getValue("moisDeb");
this.p.moisFin=this.param.getValue("moisFin");

}

function FermetureZone_parametre(date,metier,suivie,gestionMetier){
this.p.metier = metier;
this.p.date = date;
this.p.suivie = suivie;
this.p.gestionMetier = gestionMetier;

}

FermetureZone.prototype.parametre = FermetureZone_parametre;
function FermetureZone_condition(p, oldValue){
writeln("condition fermeture zone");
var mois = p.date.getMois().getNumMois();
writeln("mois:"+mois);
if(!(p.moisDeb<=mois && mois<=p.moisFin))
  return false;
writeln("on est dans l'espace des mois possible");
//on est dans l'espace des mois possible
if(p.date.before(p.dateDeb))
  return false;
if(p.date.after(p.dateFin))
  return false;

var mailleMetier = p.metier.getSecteurMois(p.date.getMois()).getMaille();

// s'il y a une intersection avec la zone ferme, alors la regle s'applique
mailleMetier.retainAll(p.mailles)
var result = mailleMetier.size() != 0;

if(result)
  writeln("===== Fermeture Zone s'applique ======");
return result;

}

FermetureZone.prototype.condition = FermetureZone_condition;
function FermetureZone_actionAvant(p){
writeln("fermeture zone Action avant metier:"+p.metier);
writeln("Les mailles fermees sont:"+p.mailles);

var zoneMetier = p.metier.getSecteurMois(p.date.getMois());
var mailleMetier = zoneMetier.getMaille().copy();
mailleMetier.removeAll(p.mailles);
writeln("inter maille:"+mailleMetier.size());
// test pour savoir si toute la zone de pratique du metier
// (reunion de toutes les zones metiers  de metier a date)
// est totalement incluse dans la zone fermeture
if (mailleMetier.size() != 0){ //le cas intersection.length==mailleMetier est dans condition
  // si toute la zone de pratique du metier n'est pas incluse dans zone fermeture

  //creation du nouveau secteur de metier
  var secteurResult = MetaSecteurFactory.create("MetaFermeture-"+p.metier.getNom()+"-"+date.getDate(), p.metier.getRegion(), "Secteur creer durant la simulation.");
  writeln("nouveau secteur cree:"+secteurResult);
  var zonesMetier = zoneMetier.getAllSecteur();
  writeln("zonesMetier:"+zonesMetier);
  writeln("zonesMetier.size:"+zonesMetier.size());

  for(var i=0; i<zonesMetier.size(); i++){
    var zonemet = zonesMetier.get(i);
    writeln("zonemet:"+zonemet);
    // intersection entre la zeme zone metier a date et zone de fermeture
    var listemailleszonemetier = zonemet.getMaille().copy();
    var nbMailleZoneMetier = listemailleszonemetier.size();
    writeln("maille metier:"+listemailleszonemetier);
    writeln("maille fermeture:"+p.mailles);
    listemailleszonemetier.removeAll(p.mailles);
    if(0==listemailleszonemetier.size()){
      //si completement inclus on le supprime
      //donc on ne le met pas dans le nouveau
      writeln("on supprime la zone"+zonemet);
    }
    else if (listemailleszonemetier.size() != nbMailleZoneMetier) {
      // si la zone metier n'est pas totalement incluse dans zone de fermeture
      // on reduit  la zeme zone metier de cette intersection
      // pas de modif de la matrice de proportion strmet
      writeln("on cree une nouvelle zone a partir de:"+zonemet+" avec "+listemailleszonemetier);
      var simpleSecteur = SecteurSimpleFactory.create("Fermeture-"+p.metier.getNom()+"-"+zonemet+"-"+date.getDate(), p.metier.getRegion(), "Secteur creer durant la simulation.");
      simpleSecteur.addAllMaille(listemailleszonemetier);
      secteurResult.addSecteur(simpleSecteur);
     writeln("apres addSecteur");  
  }else {
      //sinon on le met dans le nouveau
      writeln("On remet tel quelle la zone:"+zonemet);
      secteurResult.addSecteur(zonemet);
    }
  }// fin du for sur les zone metier de la zone de pratique du metier
  writeln("Zone metier avant"+zoneMetier.getMaille());
  writeln("Zone metier apres"+secteurResult);
  writeln("Zone metier apres"+secteurResult.getMaille());
  p.metier.setSecteurMois(secteurResult, p.date.getMois());
}  
else {
  writeln("Toute la zone metier est ferme");
  // sinon toute la zone de pratique du metier est incluse dans zone fermeture
  // alors metier devient metier-nonactivite
      
  //listes des strategies contenant ce metier et tel que strmet(metier,date)!=0
  var listMetiers = db.oql("select * from fr.ifremer.db.StrMetFactory where metier=? and proportion!=0",
    (new DBArgument()).add(p.metier));

  writeln("");

  var listestrategiesdemetier = new DBUniqueCollection(StrategieFactory);
  for(var i=0; i<listMetiers.size(); i++)
     listestrategiesdemetier.add(listMetiers.get(i).getStrategie());

  writeln("Resultat de la requete:"+listestrategiesdemetier);
  var metChomage = MetierFactory.findByKey("nonActivite", p.metier.getRegion());
  writeln("Metier nonActivite:"+metChomage);
  for (var s=0; s<listestrategiesdemetier.size(); s++){
    var strategie = listestrategiesdemetier.get(s);
    writeln("debut pour str:"+strategie);
    var strMet = StrMetFactory.findByKey(strategie, p.metier, p.date.getMois());
    writeln("strmet:"+strMet);
    var strMetChomage = StrMetFactory.findByKey(strategie, metChomage, p.date.getMois());
    writeln("strmet chomage:"+strMetChomage);
    strMetChomage.setProportion(strMetChomage.getProportion()+strMet.getProportion());
    strMet.setProportion(0);
    writeln("fin pour str:"+strategie);
  }
}// fin du else passage a metier-nonactivite
writeln("fin fermeture zone action avant");
return p.gestionMetier;
}

FermetureZone.prototype.actionAvant = FermetureZone_actionAvant;
function FermetureZone_actionApres(p){
writeln("Action apres");
return p.gestionMetier;
}

FermetureZone.prototype.actionApres = FermetureZone_actionApres;
function FermetureZoneS1(param){
var StringBuffer = Packages.java.lang.StringBuffer;
var Date = Packages.fr.ifremer.nodb.Date;
var XMLUtil = Packages.org.codelutin.xml.XMLUtil;

this.param = param;

//construction de p
this.p = new Object();
this.p.paramRegle = this.param;
//la zone de fermeture
this.p.zone= this.param.getValue("zone");
writeln("zone:"+this.p.zone);
//les mailles du secteur de fermeture
this.p.mailles = this.p.zone.getMaille();

this.p.dateDeb=this.param.getValue("dateDeb");
this.p.dateFin=this.param.getValue("dateFin");

this.p.moisDeb=this.param.getValue("moisDeb");
this.p.moisFin=this.param.getValue("moisFin");

}

function FermetureZoneS1_parametre(date,metier,suivie,gestionMetier){
this.p.metier = metier;
this.p.date = date;
this.p.suivie = suivie;
this.p.gestionMetier = gestionMetier;

}

FermetureZoneS1.prototype.parametre = FermetureZoneS1_parametre;
function FermetureZoneS1_condition(p, oldValue){
writeln("condition fermeture zone");
var mois = p.date.getMois().getNumMois();
writeln("mois:"+mois);
if(!(p.moisDeb<=mois && mois<=p.moisFin))
  return false;
writeln("on est dans l'espace des mois possible");
//on est dans l'espace des mois possible
if(p.date.before(p.dateDeb))
  return false;
if(p.date.after(p.dateFin))
  return false;

var mailleMetier = p.metier.getSecteurMois(p.date.getMois()).getMaille();

// s'il y a une intersection avec la zone ferme, alors la regle s'applique
mailleMetier.retainAll(p.mailles)
var result = mailleMetier.size() != 0;

if(result)
  writeln("===== Fermeture Zone s'applique ======");
return result;

}

FermetureZoneS1.prototype.condition = FermetureZoneS1_condition;
function FermetureZoneS1_actionAvant(p){
writeln("fermeture zone Action avant metier:"+p.metier);
writeln("Les mailles fermees sont:"+p.mailles);

var zoneMetier = p.metier.getSecteurMois(p.date.getMois());
var mailleMetier = zoneMetier.getMaille().copy();
mailleMetier.removeAll(p.mailles);
writeln("inter maille:"+mailleMetier.size());
// test pour savoir si toute la zone de pratique du metier
// (reunion de toutes les zones metiers  de metier a date)
// est totalement incluse dans la zone fermeture
if (mailleMetier.size() != 0){ //le cas intersection.length==mailleMetier est dans condition
  // si toute la zone de pratique du metier n'est pas incluse dans zone fermeture

  //creation du nouveau secteur de metier
  var secteurResult = MetaSecteurFactory.create("MetaFermeture-"+p.metier.getNom()+"-"+date.getDate(), p.metier.getRegion(), "Secteur creer durant la simulation.");
  writeln("nouveau secteur cree:"+secteurResult);
  var zonesMetier = zoneMetier.getAllSecteur();
  writeln("zonesMetier:"+zonesMetier);
  writeln("zonesMetier.size:"+zonesMetier.size());

  for(var i=0; i<zonesMetier.size(); i++){
    var zonemet = zonesMetier.get(i);
    writeln("zonemet:"+zonemet);
    // intersection entre la zeme zone metier a date et zone de fermeture
    var listemailleszonemetier = zonemet.getMaille().copy();
    var nbMailleZoneMetier = listemailleszonemetier.size();
    writeln("maille metier:"+listemailleszonemetier);
    writeln("maille fermeture:"+p.mailles);
    listemailleszonemetier.removeAll(p.mailles);
    if(0==listemailleszonemetier.size()){
      //si completement inclus on le supprime
      //donc on ne le met pas dans le nouveau
      writeln("on supprime la zone"+zonemet);
    }
    else if (listemailleszonemetier.size() != nbMailleZoneMetier) {
      // si la zone metier n'est pas totalement incluse dans zone de fermeture
      // on reduit  la zeme zone metier de cette intersection
      // pas de modif de la matrice de proportion strmet
      writeln("on cree une nouvelle zone a partir de:"+zonemet+" avec "+listemailleszonemetier);
      var simpleSecteur = SecteurSimpleFactory.create("Fermeture-"+p.metier.getNom()+"-"+zonemet+"-"+date.getDate(), p.metier.getRegion(), "Secteur creer durant la simulation.");
      simpleSecteur.addAllMaille(listemailleszonemetier);
      secteurResult.addSecteur(simpleSecteur);
     writeln("apres addSecteur");  
  }else {
      //sinon on le met dans le nouveau
      writeln("On remet tel quelle la zone:"+zonemet);
      secteurResult.addSecteur(zonemet);
    }
  }// fin du for sur les zone metier de la zone de pratique du metier
  writeln("Zone metier avant"+zoneMetier.getMaille());
  writeln("Zone metier apres"+secteurResult);
  writeln("Zone metier apres"+secteurResult.getMaille());
  p.metier.setSecteurMois(secteurResult, p.date.getMois());
}  
else {
  writeln("Toute la zone metier est ferme");
  // sinon toute la zone de pratique du metier est incluse dans zone fermeture
  // alors metier devient metier-nonactivite
      
  //listes des strategies contenant ce metier et tel que strmet(metier,date)!=0
  var listMetiers = db.oql("select * from fr.ifremer.db.StrMetFactory where metier=? and proportion!=0",
    (new DBArgument()).add(p.metier));

  writeln("");

  var listestrategiesdemetier = new DBUniqueCollection(StrategieFactory);
  for(var i=0; i<listMetiers.size(); i++)
     listestrategiesdemetier.add(listMetiers.get(i).getStrategie());

  writeln("Resultat de la requete:"+listestrategiesdemetier);
  var metChomage = MetierFactory.findByKey("nonActivite", p.metier.getRegion());
  writeln("Metier nonActivite:"+metChomage);
  for (var s=0; s<listestrategiesdemetier.size(); s++){
    var strategie = listestrategiesdemetier.get(s);
    writeln("debut pour str:"+strategie);
    var strMet = StrMetFactory.findByKey(strategie, p.metier, p.date.getMois());
    writeln("strmet:"+strMet);
    var strMetChomage = StrMetFactory.findByKey(strategie, metChomage, p.date.getMois());
    writeln("strmet chomage:"+strMetChomage);
    strMetChomage.setProportion(strMetChomage.getProportion()+strMet.getProportion());
    strMet.setProportion(0);
    writeln("fin pour str:"+strategie);
  }
}// fin du else passage a metier-nonactivite
writeln("fin fermeture zone action avant");
return p.gestionMetier;
}

FermetureZoneS1.prototype.actionAvant = FermetureZoneS1_actionAvant;
function FermetureZoneS1_actionApres(p){
writeln("Action apres");
return p.gestionMetier;
}

FermetureZoneS1.prototype.actionApres = FermetureZoneS1_actionApres;
function FermetureZoneS1S2(param){
var StringBuffer = Packages.java.lang.StringBuffer;
var Date = Packages.fr.ifremer.nodb.Date;
var XMLUtil = Packages.org.codelutin.xml.XMLUtil;

this.param = param;

//construction de p
this.p = new Object();
this.p.paramRegle = this.param;
//la zone de fermeture
this.p.zone= this.param.getValue("zone");
writeln("zone:"+this.p.zone);
//les mailles du secteur de fermeture
this.p.mailles = this.p.zone.getMaille();

this.p.dateDeb=this.param.getValue("dateDeb");
this.p.dateFin=this.param.getValue("dateFin");

this.p.moisDeb=this.param.getValue("moisDeb");
this.p.moisFin=this.param.getValue("moisFin");

}

function FermetureZoneS1S2_parametre(date,metier,suivie,gestionMetier){
this.p.metier = metier;
this.p.date = date;
this.p.suivie = suivie;
this.p.gestionMetier = gestionMetier;

}

FermetureZoneS1S2.prototype.parametre = FermetureZoneS1S2_parametre;
function FermetureZoneS1S2_condition(p, oldValue){
writeln("condition fermeture zone");
var mois = p.date.getMois().getNumMois();
writeln("mois:"+mois);
if(!(p.moisDeb<=mois && mois<=p.moisFin))
  return false;
writeln("on est dans l'espace des mois possible");
//on est dans l'espace des mois possible
if(p.date.before(p.dateDeb))
  return false;
if(p.date.after(p.dateFin))
  return false;

var mailleMetier = p.metier.getSecteurMois(p.date.getMois()).getMaille();

// s'il y a une intersection avec la zone ferme, alors la regle s'applique
mailleMetier.retainAll(p.mailles)
var result = mailleMetier.size() != 0;

if(result)
  writeln("===== Fermeture Zone s'applique ======");
return result;

}

FermetureZoneS1S2.prototype.condition = FermetureZoneS1S2_condition;
function FermetureZoneS1S2_actionAvant(p){
writeln("fermeture zone Action avant metier:"+p.metier);
writeln("Les mailles fermees sont:"+p.mailles);

var zoneMetier = p.metier.getSecteurMois(p.date.getMois());
var mailleMetier = zoneMetier.getMaille().copy();
mailleMetier.removeAll(p.mailles);
writeln("inter maille:"+mailleMetier.size());
// test pour savoir si toute la zone de pratique du metier
// (reunion de toutes les zones metiers  de metier a date)
// est totalement incluse dans la zone fermeture
if (mailleMetier.size() != 0){ //le cas intersection.length==mailleMetier est dans condition
  // si toute la zone de pratique du metier n'est pas incluse dans zone fermeture

  //creation du nouveau secteur de metier
  var secteurResult = MetaSecteurFactory.create("MetaFermeture-"+p.metier.getNom()+"-"+date.getDate(), p.metier.getRegion(), "Secteur creer durant la simulation.");
  writeln("nouveau secteur cree:"+secteurResult);
  var zonesMetier = zoneMetier.getAllSecteur();
  writeln("zonesMetier:"+zonesMetier);
  writeln("zonesMetier.size:"+zonesMetier.size());

  for(var i=0; i<zonesMetier.size(); i++){
    var zonemet = zonesMetier.get(i);
    writeln("zonemet:"+zonemet);
    // intersection entre la zeme zone metier a date et zone de fermeture
    var listemailleszonemetier = zonemet.getMaille().copy();
    var nbMailleZoneMetier = listemailleszonemetier.size();
    writeln("maille metier:"+listemailleszonemetier);
    writeln("maille fermeture:"+p.mailles);
    listemailleszonemetier.removeAll(p.mailles);
    if(0==listemailleszonemetier.size()){
      //si completement inclus on le supprime
      //donc on ne le met pas dans le nouveau
      writeln("on supprime la zone"+zonemet);
    }
    else if (listemailleszonemetier.size() != nbMailleZoneMetier) {
      // si la zone metier n'est pas totalement incluse dans zone de fermeture
      // on reduit  la zeme zone metier de cette intersection
      // pas de modif de la matrice de proportion strmet
      writeln("on cree une nouvelle zone a partir de:"+zonemet+" avec "+listemailleszonemetier);
      var simpleSecteur = SecteurSimpleFactory.create("Fermeture-"+p.metier.getNom()+"-"+zonemet+"-"+date.getDate(), p.metier.getRegion(), "Secteur creer durant la simulation.");
      simpleSecteur.addAllMaille(listemailleszonemetier);
      secteurResult.addSecteur(simpleSecteur);
     writeln("apres addSecteur");  
  }else {
      //sinon on le met dans le nouveau
      writeln("On remet tel quelle la zone:"+zonemet);
      secteurResult.addSecteur(zonemet);
    }
  }// fin du for sur les zone metier de la zone de pratique du metier
  writeln("Zone metier avant"+zoneMetier.getMaille());
  writeln("Zone metier apres"+secteurResult);
  writeln("Zone metier apres"+secteurResult.getMaille());
  p.metier.setSecteurMois(secteurResult, p.date.getMois());
}  
else {
  writeln("Toute la zone metier est ferme");
  // sinon toute la zone de pratique du metier est incluse dans zone fermeture
  // alors metier devient metier-nonactivite
      
  //listes des strategies contenant ce metier et tel que strmet(metier,date)!=0
  var listMetiers = db.oql("select * from fr.ifremer.db.StrMetFactory where metier=? and proportion!=0",
    (new DBArgument()).add(p.metier));

  writeln("");

  var listestrategiesdemetier = new DBUniqueCollection(StrategieFactory);
  for(var i=0; i<listMetiers.size(); i++)
     listestrategiesdemetier.add(listMetiers.get(i).getStrategie());

  writeln("Resultat de la requete:"+listestrategiesdemetier);
  var metChomage = MetierFactory.findByKey("nonActivite", p.metier.getRegion());
  writeln("Metier nonActivite:"+metChomage);
  for (var s=0; s<listestrategiesdemetier.size(); s++){
    var strategie = listestrategiesdemetier.get(s);
    writeln("debut pour str:"+strategie);
    var strMet = StrMetFactory.findByKey(strategie, p.metier, p.date.getMois());
    writeln("strmet:"+strMet);
    var strMetChomage = StrMetFactory.findByKey(strategie, metChomage, p.date.getMois());
    writeln("strmet chomage:"+strMetChomage);
    strMetChomage.setProportion(strMetChomage.getProportion()+strMet.getProportion());
    strMet.setProportion(0);
    writeln("fin pour str:"+strategie);
  }
}// fin du else passage a metier-nonactivite
writeln("fin fermeture zone action avant");
return p.gestionMetier;
}

FermetureZoneS1S2.prototype.actionAvant = FermetureZoneS1S2_actionAvant;
function FermetureZoneS1S2_actionApres(p){
writeln("Action apres");
return p.gestionMetier;
}

FermetureZoneS1S2.prototype.actionApres = FermetureZoneS1S2_actionApres;
function FermetureZoneS2(param){
var StringBuffer = Packages.java.lang.StringBuffer;
var Date = Packages.fr.ifremer.nodb.Date;
var XMLUtil = Packages.org.codelutin.xml.XMLUtil;

this.param = param;

//construction de p
this.p = new Object();
this.p.paramRegle = this.param;
//la zone de fermeture
this.p.zone= this.param.getValue("zone");
writeln("zone:"+this.p.zone);
//les mailles du secteur de fermeture
this.p.mailles = this.p.zone.getMaille();

this.p.dateDeb=this.param.getValue("dateDeb");
this.p.dateFin=this.param.getValue("dateFin");

this.p.moisDeb=this.param.getValue("moisDeb");
this.p.moisFin=this.param.getValue("moisFin");

}

function FermetureZoneS2_parametre(date,metier,suivie,gestionMetier){
this.p.metier = metier;
this.p.date = date;
this.p.suivie = suivie;
this.p.gestionMetier = gestionMetier;

}

FermetureZoneS2.prototype.parametre = FermetureZoneS2_parametre;
function FermetureZoneS2_condition(p, oldValue){
writeln("condition fermeture zone");
var mois = p.date.getMois().getNumMois();
writeln("mois:"+mois);
if(!(p.moisDeb<=mois && mois<=p.moisFin))
  return false;
writeln("on est dans l'espace des mois possible");
//on est dans l'espace des mois possible
if(p.date.before(p.dateDeb))
  return false;
if(p.date.after(p.dateFin))
  return false;

var mailleMetier = p.metier.getSecteurMois(p.date.getMois()).getMaille();

// s'il y a une intersection avec la zone ferme, alors la regle s'applique
mailleMetier.retainAll(p.mailles)
var result = mailleMetier.size() != 0;

if(result)
  writeln("===== Fermeture Zone s'applique ======");
return result;

}

FermetureZoneS2.prototype.condition = FermetureZoneS2_condition;
function FermetureZoneS2_actionAvant(p){
writeln("fermeture zone Action avant metier:"+p.metier);
writeln("Les mailles fermees sont:"+p.mailles);

var zoneMetier = p.metier.getSecteurMois(p.date.getMois());
var mailleMetier = zoneMetier.getMaille().copy();
mailleMetier.removeAll(p.mailles);
writeln("inter maille:"+mailleMetier.size());
// test pour savoir si toute la zone de pratique du metier
// (reunion de toutes les zones metiers  de metier a date)
// est totalement incluse dans la zone fermeture
if (mailleMetier.size() != 0){ //le cas intersection.length==mailleMetier est dans condition
  // si toute la zone de pratique du metier n'est pas incluse dans zone fermeture

  //creation du nouveau secteur de metier
  var secteurResult = MetaSecteurFactory.create("MetaFermeture-"+p.metier.getNom()+"-"+date.getDate(), p.metier.getRegion(), "Secteur creer durant la simulation.");
  writeln("nouveau secteur cree:"+secteurResult);
  var zonesMetier = zoneMetier.getAllSecteur();
  writeln("zonesMetier:"+zonesMetier);
  writeln("zonesMetier.size:"+zonesMetier.size());

  for(var i=0; i<zonesMetier.size(); i++){
    var zonemet = zonesMetier.get(i);
    writeln("zonemet:"+zonemet);
    // intersection entre la zeme zone metier a date et zone de fermeture
    var listemailleszonemetier = zonemet.getMaille().copy();
    var nbMailleZoneMetier = listemailleszonemetier.size();
    writeln("maille metier:"+listemailleszonemetier);
    writeln("maille fermeture:"+p.mailles);
    listemailleszonemetier.removeAll(p.mailles);
    if(0==listemailleszonemetier.size()){
      //si completement inclus on le supprime
      //donc on ne le met pas dans le nouveau
      writeln("on supprime la zone"+zonemet);
    }
    else if (listemailleszonemetier.size() != nbMailleZoneMetier) {
      // si la zone metier n'est pas totalement incluse dans zone de fermeture
      // on reduit  la zeme zone metier de cette intersection
      // pas de modif de la matrice de proportion strmet
      writeln("on cree une nouvelle zone a partir de:"+zonemet+" avec "+listemailleszonemetier);
      var simpleSecteur = SecteurSimpleFactory.create("Fermeture-"+p.metier.getNom()+"-"+zonemet+"-"+date.getDate(), p.metier.getRegion(), "Secteur creer durant la simulation.");
      simpleSecteur.addAllMaille(listemailleszonemetier);
      secteurResult.addSecteur(simpleSecteur);
     writeln("apres addSecteur");  
  }else {
      //sinon on le met dans le nouveau
      writeln("On remet tel quelle la zone:"+zonemet);
      secteurResult.addSecteur(zonemet);
    }
  }// fin du for sur les zone metier de la zone de pratique du metier
  writeln("Zone metier avant"+zoneMetier.getMaille());
  writeln("Zone metier apres"+secteurResult);
  writeln("Zone metier apres"+secteurResult.getMaille());
  p.metier.setSecteurMois(secteurResult, p.date.getMois());
}  
else {
  writeln("Toute la zone metier est ferme");
  // sinon toute la zone de pratique du metier est incluse dans zone fermeture
  // alors metier devient metier-nonactivite
      
  //listes des strategies contenant ce metier et tel que strmet(metier,date)!=0
  var listMetiers = db.oql("select * from fr.ifremer.db.StrMetFactory where metier=? and proportion!=0",
    (new DBArgument()).add(p.metier));

  writeln("");

  var listestrategiesdemetier = new DBUniqueCollection(StrategieFactory);
  for(var i=0; i<listMetiers.size(); i++)
     listestrategiesdemetier.add(listMetiers.get(i).getStrategie());

  writeln("Resultat de la requete:"+listestrategiesdemetier);
  var metChomage = MetierFactory.findByKey("nonActivite", p.metier.getRegion());
  writeln("Metier nonActivite:"+metChomage);
  for (var s=0; s<listestrategiesdemetier.size(); s++){
    var strategie = listestrategiesdemetier.get(s);
    writeln("debut pour str:"+strategie);
    var strMet = StrMetFactory.findByKey(strategie, p.metier, p.date.getMois());
    writeln("strmet:"+strMet);
    var strMetChomage = StrMetFactory.findByKey(strategie, metChomage, p.date.getMois());
    writeln("strmet chomage:"+strMetChomage);
    strMetChomage.setProportion(strMetChomage.getProportion()+strMet.getProportion());
    strMet.setProportion(0);
    writeln("fin pour str:"+strategie);
  }
}// fin du else passage a metier-nonactivite
writeln("fin fermeture zone action avant");
return p.gestionMetier;
}

FermetureZoneS2.prototype.actionAvant = FermetureZoneS2_actionAvant;
function FermetureZoneS2_actionApres(p){
writeln("Action apres");
return p.gestionMetier;
}

FermetureZoneS2.prototype.actionApres = FermetureZoneS2_actionApres;
function Gravite(param){
var StringBuffer = Packages.java.lang.StringBuffer;
var Date = Packages.fr.ifremer.nodb.Date;
var XMLUtil = Packages.org.codelutin.xml.XMLUtil;

this.param = param;

//construction de p
this.p = new Object();
this.p.paramRegle = this.param;

}

function Gravite_parametre(date,metier,suivie,gestionMetier){
this.p.metier = metier;
this.p.date = date;
this.p.suivie = suivie;
this.p.gestionMetier = gestionMetier;

}

Gravite.prototype.parametre = Gravite_parametre;
function Gravite_condition(p, oldValue){
// Il faut etre au moins au deuxieme pas de temps.
return p.date.getDate() > 0;

}

Gravite.prototype.condition = Gravite_condition;
function Gravite_actionAvant(p){
writeln("Gravite Action avant metier:"+p.metier+ "date:"+ p.date);
var d = p.date.preview();
var month = d.getMois();
var allStr = SiMatrice.getListStrategies();
for(var i=0; i<allStr.size(); i++){
  var str = allStr.get(i);
  // on fait les calcules a partir du mois precedent
  var strMonthInfo = str.getStrategyMonthInfo(month);
  var propStrMet = strMonthInfo.getPropStrMetier(p.metier);
  if(propStrMet != null){
    // si null, alors le metier n'est pas pratiqu par cette strategie
    var prop = strMonthInfo.getProportionMetier(p.metier);
    var newProp = GravityModel.landingPerUnitFishingEffort(str, p.metier, d);
    var newPropDiv = newProp / GravityModel.sumLandingPerUnitFishingEffort(d);

    // on recupere celui du mois courant, pour le modifier
    strMonthInfo = str.getStrategyMonthInfo(p.date.getMois());
    strMonthInfo.setProportionMetier(p.metier, newPropDiv);
  }
}
writeln("fin Gravite Action avant oldProp:"+prop+" newProp:"+ newProp+ " newPropDiv:"+newPropDiv);
return p.gestionMetier;

}

Gravite.prototype.actionAvant = Gravite_actionAvant;
function Gravite_actionApres(p){
writeln("Action apres");
return p.gestionMetier;
}

Gravite.prototype.actionApres = Gravite_actionApres;
function TAC(param){
this.param = param;

this.p = new Object();

writeln("Init du TAC");
//objet comprenant: TACAn,metapop,dateDeb,dateFin
this.p.dateDeb=this.param.getValue("dateDeb");
this.p.dateFin=this.param.getValue("dateFin");
this.p.TACAn = this.param.getValue("TACAn");
writeln("recuperation de la meta pop");
this.p.metapop= this.param.getValue("metapop");

writeln("TAC de :"+this.p.dateDeb+"-"+this.p.dateFin+" "+this.p.TACAn+" sur "+this.p.metapop);

}

function TAC_parametre(date,metier,suivie,gestionMetier){
this.p.metier = metier;
this.p.date = date;
this.p.suivie = suivie;
this.p.gestionMetier = gestionMetier;

}

TAC.prototype.parametre = TAC_parametre;
function TAC_condition(p, oldValue){
// si oldValue existe on est dans la condition pour actionApres.
// il faut donc reprendre oldValue comme valeur de retour
writeln("Recherche si le tac s'applique (oldValue="+oldValue);
var result = false;
if(oldValue != undefined)
  result = oldValue;
else if(p.date.before(p.dateDeb))
  result = false;
else if(p.date.after(p.dateFin))
  result = false;

else if(Regle_action_lib.totalCcum(p.suivie,p.metapop) >= p.TACAn){
writeln("Tac atteind");
  if(Regle_libUtil.isCaptureDate(p.date,p.metapop, p.metier))
    result = true;
}

writeln("fin de condition TAC:"+result);
return result;

}

TAC.prototype.condition = TAC_condition;
function TAC_actionAvant(p){
writeln("Action avant");
var metier=p.metier;
writeln("le metier vise par le tac : "+metier);
var metiernonactivite = Regle_libUtil.getMetierNonActivite();

if(Regle_libUtil.isCapturePrincipaleDate(p.date,p.metapop, p.metier)){
     // on recupere les strategies qui contiennent ce metier
  var ListeStrategiesDuMetierViseAdate= 
      Regle_libUtil.getStrategiesMetierDate(p.date,p.metier);

  var ListeMetiersVises = Regle_libUtil.getMetiersVises(p.date,p.metapop);

  // 1er cas de figure : report sur les metiers de la strategie qui ont le meme engin	
			
  for (var s=0;s<ListeStrategiesDuMetierViseAdate.length;s++) {
    // pour chaque strategie contenant le metier vise metier
    var strategie=ListeStrategiesDuMetierViseAdate[s];
    writeln("strategie du metier vise "+metier+" par le tac :"+strategie);
    // liste des metiers ayant la metapop comme capture secondaire dans strategie
    var ListeMetiersDeLaStrategieCaptureSecondaire =
          Regle_libUtil.getMetiersSecondaireDateStr(p.date,strategie,p.metapop);
    // liste des metiers de la strategie sauf metier
    var ListeMetiersDeLaStrategieSaufmetier=
         Regle_libUtil.getMetiersStrategieDateSauf1(p.date,metier,strategie);
writeln(" cas 1["+ListeMetiersDeLaStrategieSaufmetier+"], ["+ListeMetiersVises+"], ["+ListeMetiersDeLaStrategieCaptureSecondaire+"]"); 
    var metderemplacement = Regle_action_lib.NbetListeMetiersRemplacementsAvecEngin
                             (metier,ListeMetiersDeLaStrategieSaufmetier,
                              ListeMetiersVises,
                              ListeMetiersDeLaStrategieCaptureSecondaire);
    var NbMet = metderemplacement.NbMet;
    var ListeMet = metderemplacement.ListeMet;
writeln("cas 1 NbMetremplacement :"+NbMet);
    // reaction
    if (NbMet>=1) {//s'il y a au moins 1 metier de remplacement dans la strategie
      //1er cas de figure : report de l'effort
      // on repartit l'effort de metier sur ces metiers (ListeMet)
writeln("cas1:"+ListeMet+", "+metier+", "+strategie);
      Regle_action_lib.repartirEffortDansMemeStrategieQueMetier(
          p.date,strategie, ListeMet, metier);
    }
    else {
      //echec 1er cas figure: s'il n'y a aucun metier dans la strategie qui ait le meme engin 
      // pour chaque strategie contenant le metier vise metier
writeln(" cas 2 ["+ListeMetiersDeLaStrategieSaufmetier+"], ["+ListeMetiersVises+"], ["+ListeMetiersDeLaStrategieCaptureSecondaire+"]");     
     var metderemplacement = Regle_action_lib.NbetListeMetiersRemplacements
                             (ListeMetiersDeLaStrategieSaufmetier,
                              ListeMetiersVises,
                              ListeMetiersDeLaStrategieCaptureSecondaire);
     var NbMet = metderemplacement.NbMet;
     var ListeMet = metderemplacement.ListeMet;
writeln("cas 2 NbMetremplacement :"+NbMet);
      // reaction
     if (NbMet>=1) {//s'il y a au moins 1 metier de remplacement dans la strategie
        //2eme cas de figure : report de l'effort
        // on repartit l'effort de metier sur ces metiers (ListeMet)
writeln("cas2:"+ListeMet+", "+metier+", "+strategie);
        Regle_action_lib.repartirEffortDansMemeStrategieQueMetier(
            p.date,strategie, ListeMet, metier);
      }
      else{ // s'il n'y a pas de metier de remplacement dans strategie
       // echec 2eme cas de figure : report sur les metiers des autres strategies
       // initialisations
    
       // remplacements possibles
       // liste des metiers ayant la metapop comme capture secondaire dans toutes
       // les autres strategies
       // cette liste ne comprend pas les metiers qui ne peuvent
       // capturer metapop
       var ListeAllMetiersCaptureSecondaire =
           Regle_libUtil.getAllMetiersSecondaireDateSaufStr(p.date,strategie,p.metapop);
       // dans la liste des metiers de remplacement, il faut 
       // rajouter les metiers qui ne capturent pas l'espece
       var ListeAllMetiersSaufmetier=Regle_libUtil.getAllMetiersSauf1Date(p.date,p.metier);
writeln(" cas 3 ["+ListeAllMetiersSaufmetier+"], ["+ListeMetiersVises+"], ["+ListeAllMetiersCaptureSecondaire+"]");
       var metderemplacement = Regle_action_lib.NbetListeMetiersRemplacementsAvecEngin
                             (metier,ListeAllMetiersSaufmetier,
                              ListeMetiersVises,
                              ListeAllMetiersCaptureSecondaire);
       var NbMet = metderemplacement.NbMet;
       var ListeMet = metderemplacement.ListeMet;
writeln("cas 3 NbMetremplacement :"+NbMet);
        // reaction
       if (NbMet>=1) {
          //s'il y a au moins 1 metier de remplacement dans la pecherie
          //3eme cas de figure : report de l'effort sur les metiers des autres strategies 
          //ayant le meme engin et ayant metapop comme captures secondaires
          //ATTENTION CE REPORT N A DE SENS QUE SI LES STRATEGIES ONT LE
          //MEME NB D UNITES DE PECHE SINON PB AVEC LES PROPORTIONS
          //on repartit l'effort de metier sur ces metiers (ListeMet)
writeln("cas3:"+ListeMet+", "+metier+", "+strategie);
          Regle_action_lib.repartirEffortDansAutresStrategiesQueMetier(
              p.date,ListeMet,metier,strategie);    
        }
        else{
          // echec du 3eme cas de figure
          // s'il n'y a aucun metier dans la pecherie ayant le meme engin que metier
          // alors on cherche lesmetiers possibles de remplacement dans la pecherie
writeln("cas3 else (cas4 et cas5):["+ListeAllMetiersSaufmetier+"], ["+ListeMetiersVises+"], ["+ListeAllMetiersCaptureSecondaire+"]"); 
        var metderemplacement = Regle_action_lib.NbetListeMetiersRemplacements
                             (ListeAllMetiersSaufmetier,
                              ListeMetiersVises,
                              ListeAllMetiersCaptureSecondaire);
        var NbMet = metderemplacement.NbMet;
        var ListeMet = metderemplacement.ListeMet;
writeln("cas4 et cas5 NbMetierremplacement:"+NbMet);
        // reaction
        if(NbMet>=1){
         // 4eme cas de figure : report de l'effort sur les metiers de la pecherie
writeln("cas4:");
writeln(ListeMet+", "+metier+", "+strategie);
         Regle_action_lib.repartirEffortDansAutresStrategiesQueMetier(
              p.date, ListeMet, metier, strategie);
        }
        else {
         // echec du 4eme cas de figure : pas de metier de remplacement dans la pecherie le metier passe 
         // donc au chomage dans sa strategie
writeln("cas5:"+ListeMet+", "+metier+", "+strategie);
         Regle_action_lib.MettreAuChomageMetierDansSaStrategie(
              p.date,strategie,metier);
        }// fin du echec du 4eme cas de figure (else)
       }// fin du echec du 3eme cas de figure (else)
     }// fin du echec 2eme cas de figure (else)
    }// fin du echec 1er cas de figure (else)
  }// fin du for strategie du metier
}//fin du if capture principale
return p.gestionMetier;
}

TAC.prototype.actionAvant = TAC_actionAvant;
function TAC_actionApres(p){
writeln("*$*$*$* TAC.actionApres:"+p.date+" metapop:"+p.metapop+" metier:"+p.metier);
if(! Regle_libUtil.isCapturePrincipaleDate(p.date,p.metapop, p.metier)){    
  writeln("*$*$*$* ok affect capture au rejet");
  // ATTENTION        
  // les captures pour cette metapop ne sont plus du qu'au metier pour qui 
  // l'espece est secondaire: elles sont affectees aux rejets

  //pb : ne se fait pas par metier
  //il faut une matrice pour chaques pas de temps qui stocke les rejets 
  //par metier, par metapop et par classes d'age (comme pour les captures)
  //////
  Regle_action_lib.affecterCaptureRejet(p.date, p.metapop, p.suivie, p.metier);

  //on a affecte une fois cette meta pop au rejet il ne faut pas le refaire
}

return p.gestionMetier;

}

TAC.prototype.actionApres = TAC_actionApres;
function TACpoids(param){
this.param = param;

this.p = new Object();

writeln("Init du TAC");
//objet comprenant: TACAn,metapop,dateDeb,dateFin
this.p.dateDeb=this.param.getValue("dateDeb");
this.p.dateFin=this.param.getValue("dateFin");
this.p.TACAn = this.param.getValue("TACAn");
writeln("recuperation de la meta pop");
this.p.metapop= this.param.getValue("metapop");

writeln("TAC de :"+this.p.dateDeb+"-"+this.p.dateFin+" "+this.p.TACAn+" sur "+this.p.metapop);

}

function TACpoids_parametre(date,metier,suivie,gestionMetier){
this.p.metier = metier;
this.p.date = date;
this.p.suivie = suivie;
this.p.gestionMetier = gestionMetier;

}

TACpoids.prototype.parametre = TACpoids_parametre;
function TACpoids_condition(p, oldValue){
// si oldValue existe on est dans la condition pour actionApres.
// il faut donc reprendre oldValue comme valeur de retour
writeln("Recherche si le tac s'applique (oldValue="+oldValue);
var result = false;
if(oldValue != undefined)
  result = oldValue;
else if(p.date.before(p.dateDeb))
  result = false;
else if(p.date.after(p.dateFin))
  result = false;

else if(Regle_action_lib.totalCcumpoids(p.suivie,p.metapop) >= p.TACAn){
writeln("Tac atteind");
  if(Regle_libUtil.isCaptureDate(p.date,p.metapop, p.metier))
    result = true;
}

writeln("fin de condition TAC:"+result);
return result;

}

TACpoids.prototype.condition = TACpoids_condition;
function TACpoids_actionAvant(p){
writeln("Action avant");
var metier=p.metier;
writeln("le metier vise par le tac : "+metier);
var metiernonactivite = Regle_libUtil.getMetierNonActivite();

if(Regle_libUtil.isCapturePrincipaleDate(p.date,p.metapop, p.metier)){
     // on recupere les strategies qui contiennent ce metier
  var ListeStrategiesDuMetierViseAdate= 
      Regle_libUtil.getStrategiesMetierDate(p.date,p.metier);

  var ListeMetiersVises = Regle_libUtil.getMetiersVises(p.date,p.metapop);

  // 1er cas de figure : report sur les metiers de la strategie qui ont le meme engin	
			
  for (var s=0;s<ListeStrategiesDuMetierViseAdate.length;s++) {
    // pour chaque strategie contenant le metier vise metier
    var strategie=ListeStrategiesDuMetierViseAdate[s];
    writeln("strategie du metier vise "+metier+" par le tac :"+strategie);
    // liste des metiers ayant la metapop comme capture secondaire dans strategie
    var ListeMetiersDeLaStrategieCaptureSecondaire =
          Regle_libUtil.getMetiersSecondaireDateStr(p.date,strategie,p.metapop);
    // liste des metiers de la strategie sauf metier
    var ListeMetiersDeLaStrategieSaufmetier=
         Regle_libUtil.getMetiersStrategieDateSauf1(p.date,metier,strategie);
writeln(" cas 1["+ListeMetiersDeLaStrategieSaufmetier+"], ["+ListeMetiersVises+"], ["+ListeMetiersDeLaStrategieCaptureSecondaire+"]"); 
    var metderemplacement = Regle_action_lib.NbetListeMetiersRemplacementsAvecEngin
                             (metier,ListeMetiersDeLaStrategieSaufmetier,
                              ListeMetiersVises,
                              ListeMetiersDeLaStrategieCaptureSecondaire);
    var NbMet = metderemplacement.NbMet;
    var ListeMet = metderemplacement.ListeMet;
writeln("cas 1 NbMetremplacement :"+NbMet);
    // reaction
    if (NbMet>=1) {//s'il y a au moins 1 metier de remplacement dans la strategie
      //1er cas de figure : report de l'effort
      // on repartit l'effort de metier sur ces metiers (ListeMet)
writeln("cas1:"+ListeMet+", "+metier+", "+strategie);
      Regle_action_lib.repartirEffortDansMemeStrategieQueMetier(
          p.date,strategie, ListeMet, metier);
    }
    else {
      //echec 1er cas figure: s'il n'y a aucun metier dans la strategie qui ait le meme engin 
      // pour chaque strategie contenant le metier vise metier
writeln(" cas 2 ["+ListeMetiersDeLaStrategieSaufmetier+"], ["+ListeMetiersVises+"], ["+ListeMetiersDeLaStrategieCaptureSecondaire+"]");     
     var metderemplacement = Regle_action_lib.NbetListeMetiersRemplacements
                             (ListeMetiersDeLaStrategieSaufmetier,
                              ListeMetiersVises,
                              ListeMetiersDeLaStrategieCaptureSecondaire);
     var NbMet = metderemplacement.NbMet;
     var ListeMet = metderemplacement.ListeMet;
writeln("cas 2 NbMetremplacement :"+NbMet);
      // reaction
     if (NbMet>=1) {//s'il y a au moins 1 metier de remplacement dans la strategie
        //2eme cas de figure : report de l'effort
        // on repartit l'effort de metier sur ces metiers (ListeMet)
writeln("cas2:"+ListeMet+", "+metier+", "+strategie);
        Regle_action_lib.repartirEffortDansMemeStrategieQueMetier(
            p.date,strategie, ListeMet, metier);
      }
      else{ // s'il n'y a pas de metier de remplacement dans strategie
       // echec 2eme cas de figure : report sur les metiers des autres strategies
       // initialisations
    
       // remplacements possibles
       // liste des metiers ayant la metapop comme capture secondaire dans toutes
       // les autres strategies
       // cette liste ne comprend pas les metiers qui ne peuvent
       // capturer metapop
       var ListeAllMetiersCaptureSecondaire =
           Regle_libUtil.getAllMetiersSecondaireDateSaufStr(p.date,strategie,p.metapop);
       // dans la liste des metiers de remplacement, il faut 
       // rajouter les metiers qui ne capturent pas l'espece
       var ListeAllMetiersSaufmetier=Regle_libUtil.getAllMetiersSauf1Date(p.date,p.metier);
writeln(" cas 3 ["+ListeAllMetiersSaufmetier+"], ["+ListeMetiersVises+"], ["+ListeAllMetiersCaptureSecondaire+"]");
       var metderemplacement = Regle_action_lib.NbetListeMetiersRemplacementsAvecEngin
                             (metier,ListeAllMetiersSaufmetier,
                              ListeMetiersVises,
                              ListeAllMetiersCaptureSecondaire);
       var NbMet = metderemplacement.NbMet;
       var ListeMet = metderemplacement.ListeMet;
writeln("cas 3 NbMetremplacement :"+NbMet);
        // reaction
       if (NbMet>=1) {
          //s'il y a au moins 1 metier de remplacement dans la pecherie
          //3eme cas de figure : report de l'effort sur les metiers des autres strategies 
          //ayant le meme engin et ayant metapop comme captures secondaires
          //ATTENTION CE REPORT N A DE SENS QUE SI LES STRATEGIES ONT LE
          //MEME NB D UNITES DE PECHE SINON PB AVEC LES PROPORTIONS
          //on repartit l'effort de metier sur ces metiers (ListeMet)
writeln("cas3:"+ListeMet+", "+metier+", "+strategie);
          Regle_action_lib.repartirEffortDansAutresStrategiesQueMetier(
              p.date,ListeMet,metier,strategie);    
        }
        else{
          // echec du 3eme cas de figure
          // s'il n'y a aucun metier dans la pecherie ayant le meme engin que metier
          // alors on cherche lesmetiers possibles de remplacement dans la pecherie
writeln("cas3 else (cas4 et cas5):["+ListeAllMetiersSaufmetier+"], ["+ListeMetiersVises+"], ["+ListeAllMetiersCaptureSecondaire+"]"); 
        var metderemplacement = Regle_action_lib.NbetListeMetiersRemplacements
                             (ListeAllMetiersSaufmetier,
                              ListeMetiersVises,
                              ListeAllMetiersCaptureSecondaire);
        var NbMet = metderemplacement.NbMet;
        var ListeMet = metderemplacement.ListeMet;
writeln("cas4 et cas5 NbMetierremplacement:"+NbMet);
        // reaction
        if(NbMet>=1){
         // 4eme cas de figure : report de l'effort sur les metiers de la pecherie
writeln("cas4:");
writeln(ListeMet+", "+metier+", "+strategie);
         Regle_action_lib.repartirEffortDansAutresStrategiesQueMetier(
              p.date, ListeMet, metier, strategie);
        }
        else {
         // echec du 4eme cas de figure : pas de metier de remplacement dans la pecherie le metier passe 
         // donc au chomage dans sa strategie
writeln("cas5:"+ListeMet+", "+metier+", "+strategie);
         Regle_action_lib.MettreAuChomageMetierDansSaStrategie(
              p.date,strategie,metier);
        }// fin du echec du 4eme cas de figure (else)
       }// fin du echec du 3eme cas de figure (else)
     }// fin du echec 2eme cas de figure (else)
    }// fin du echec 1er cas de figure (else)
  }// fin du for strategie du metier
}//fin du if capture principale
return p.gestionMetier;
}

TACpoids.prototype.actionAvant = TACpoids_actionAvant;
function TACpoids_actionApres(p){
writeln("*$*$*$* TAC.actionApres:"+p.date+" metapop:"+p.metapop+" metier:"+p.metier);
if(! Regle_libUtil.isCapturePrincipaleDate(p.date,p.metapop, p.metier)){    
  writeln("*$*$*$* ok affect capture au rejet");
  // ATTENTION        
  // les captures pour cette metapop ne sont plus du qu'au metier pour qui 
  // l'espece est secondaire: elles sont affectees aux rejets

  //pb : ne se fait pas par metier
  //il faut une matrice pour chaques pas de temps qui stocke les rejets 
  //par metier, par metapop et par classes d'age (comme pour les captures)
  //////
  Regle_action_lib.affecterCaptureRejet(p.date, p.metapop, p.suivie, p.metier);

  //on a affecte une fois cette meta pop au rejet il ne faut pas le refaire
}

return p.gestionMetier;

}

TACpoids.prototype.actionApres = TACpoids_actionApres;
function TacBas(param){
this.param = param;

this.p = new Object();

writeln("Init du TAC");
//objet comprenant: TACAn,metapop,dateDeb,dateFin

writeln("recuperation de la meta pop");
this.p.metapop= this.param.getValue("metapop");
this.p.TACAn= 10.0;
this.p.part= this.param.getValue("part");
writeln("valeur de proportion: "+this.p.part);
this.p.changement=false;

writeln("TAC variable sur: "+this.p.metapop);









}

function TacBas_parametre(date,metier,suivie,gestionMetier){
this.p.metier = metier;
this.p.date = date;
this.p.suivie = suivie;
this.p.gestionMetier = gestionMetier;

}

TacBas.prototype.parametre = TacBas_parametre;
function TacBas_condition(p, oldValue){
// si oldValue existe on est dans la condition pour actionApres.
// il faut donc reprendre oldValue comme valeur de retour
writeln("Recherche si le tac s'applique (oldValue="+oldValue);

var result = false;
writeln ("date= "+p.date.getDate());
if(oldValue != undefined){
  result = oldValue;}



else {  var mois=p.date.getDate();
	var VerifDate=false;
	if (mois==0 || mois==12 || mois==24 || mois==36 || mois==48 || mois==60 || mois==72 || mois==84 || mois==96 || mois==108) {VerifDate=true;}
	if (VerifDate==false) {p.changement=false;}
	else if (VerifDate==true && p.changement==false){
		var biomasse=0.0;
		for (i=0; i<p.suivie.size();i++){
			var current= p.suivie.get(i);
			if(p.metapop.equals(current.getPop().getMetaPopulation())){
				var pop=current.getPop();
				var effectif=current.getN();
				var nbclasse = pop.getClasses().size();
 				var nbzone  = pop.getZonePopulation().getAllSecteur().size();
				for (classe=0; classe<nbclasse; classe++){
					if (classe<nbclasse-1 && mois!=0) {var poids=pop.getClasses.get(classe+1).getPoidsMoyen();}
					else {var poids=pop.getClasses.get(classe).getPoidsMoyen();}
					for (zone=0; zone<nbzone;zone++){
						var y=classe*(nbzone)+zone;
						biomasse= biomasse+effectif.getValue(0,y)*poids/1000.0;
					}
				}
				p.TACAn=p.part*biomasse;
				writeln("anne= "+mois/12+"    biomasse dbut anne= "+biomasse+"     proportion= "+p.part+"    TAC anne= "+p.TACAn);
				p.changement=true;
			}
		}		
	}
	
	writeln ("valeur du TAC= "+p.TACAn);
	if(Regle_action_lib.totalCcumpoids(p.suivie,p.metapop) >=p.TACAn){
		writeln ("TAC atteint");
		if(Regle_libUtil.isCaptureDate(p.date,p.metapop, p.metier)) result = true;}
}
   


writeln("fin de condition TAC:"+result);


return result;

}

TacBas.prototype.condition = TacBas_condition;
function TacBas_actionAvant(p){
writeln("Action avant");
var metier=p.metier;
writeln("le metier vise par le tac : "+metier);
var metiernonactivite = Regle_libUtil.getMetierNonActivite();

if(Regle_libUtil.isCapturePrincipaleDate(p.date,p.metapop, p.metier)){
     // on recupere les strategies qui contiennent ce metier
  var ListeStrategiesDuMetierViseAdate= 
      Regle_libUtil.getStrategiesMetierDate(p.date,p.metier);

  var ListeMetiersVises = Regle_libUtil.getMetiersVises(p.date,p.metapop);

  // 1er cas de figure : report sur les metiers de la strategie qui ont le meme engin	
			
  for (var s=0;s<ListeStrategiesDuMetierViseAdate.length;s++) {
    // pour chaque strategie contenant le metier vise metier
    var strategie=ListeStrategiesDuMetierViseAdate[s];
    writeln("strategie du metier vise "+metier+" par le tac :"+strategie);
    // liste des metiers ayant la metapop comme capture secondaire dans strategie
    var ListeMetiersDeLaStrategieCaptureSecondaire =
          Regle_libUtil.getMetiersSecondaireDateStr(p.date,strategie,p.metapop);
    // liste des metiers de la strategie sauf metier
    var ListeMetiersDeLaStrategieSaufmetier=
         Regle_libUtil.getMetiersStrategieDateSauf1(p.date,metier,strategie);
writeln(" cas 1["+ListeMetiersDeLaStrategieSaufmetier+"], ["+ListeMetiersVises+"], ["+ListeMetiersDeLaStrategieCaptureSecondaire+"]"); 
    var metderemplacement = Regle_action_lib.NbetListeMetiersRemplacementsAvecEngin
                             (metier,ListeMetiersDeLaStrategieSaufmetier,
                              ListeMetiersVises,
                              ListeMetiersDeLaStrategieCaptureSecondaire);
    var NbMet = metderemplacement.NbMet;
    var ListeMet = metderemplacement.ListeMet;
writeln("cas 1 NbMetremplacement :"+NbMet);
    // reaction
    if (NbMet>=1) {//s'il y a au moins 1 metier de remplacement dans la strategie
      //1er cas de figure : report de l'effort
      // on repartit l'effort de metier sur ces metiers (ListeMet)
writeln("cas1:"+ListeMet+", "+metier+", "+strategie);
      Regle_action_lib.repartirEffortDansMemeStrategieQueMetier(
          p.date,strategie, ListeMet, metier);
    }
    else {
      //echec 1er cas figure: s'il n'y a aucun metier dans la strategie qui ait le meme engin 
      // pour chaque strategie contenant le metier vise metier
writeln(" cas 2 ["+ListeMetiersDeLaStrategieSaufmetier+"], ["+ListeMetiersVises+"], ["+ListeMetiersDeLaStrategieCaptureSecondaire+"]");     
     var metderemplacement = Regle_action_lib.NbetListeMetiersRemplacements
                             (ListeMetiersDeLaStrategieSaufmetier,
                              ListeMetiersVises,
                              ListeMetiersDeLaStrategieCaptureSecondaire);
     var NbMet = metderemplacement.NbMet;
     var ListeMet = metderemplacement.ListeMet;
writeln("cas 2 NbMetremplacement :"+NbMet);
      // reaction
     if (NbMet>=1) {//s'il y a au moins 1 metier de remplacement dans la strategie
        //2eme cas de figure : report de l'effort
        // on repartit l'effort de metier sur ces metiers (ListeMet)
writeln("cas2:"+ListeMet+", "+metier+", "+strategie);
        Regle_action_lib.repartirEffortDansMemeStrategieQueMetier(
            p.date,strategie, ListeMet, metier);
      }
      else{ // s'il n'y a pas de metier de remplacement dans strategie
       // echec 2eme cas de figure : report sur les metiers des autres strategies
       // initialisations
    
       // remplacements possibles
       // liste des metiers ayant la metapop comme capture secondaire dans toutes
       // les autres strategies
       // cette liste ne comprend pas les metiers qui ne peuvent
       // capturer metapop
       var ListeAllMetiersCaptureSecondaire =
           Regle_libUtil.getAllMetiersSecondaireDateSaufStr(p.date,strategie,p.metapop);
       // dans la liste des metiers de remplacement, il faut 
       // rajouter les metiers qui ne capturent pas l'espece
       var ListeAllMetiersSaufmetier=Regle_libUtil.getAllMetiersSauf1Date(p.date,p.metier);
writeln(" cas 3 ["+ListeAllMetiersSaufmetier+"], ["+ListeMetiersVises+"], ["+ListeAllMetiersCaptureSecondaire+"]");
       var metderemplacement = Regle_action_lib.NbetListeMetiersRemplacementsAvecEngin
                             (metier,ListeAllMetiersSaufmetier,
                              ListeMetiersVises,
                              ListeAllMetiersCaptureSecondaire);
       var NbMet = metderemplacement.NbMet;
       var ListeMet = metderemplacement.ListeMet;
writeln("cas 3 NbMetremplacement :"+NbMet);
        // reaction
       if (NbMet>=1) {
          //s'il y a au moins 1 metier de remplacement dans la pecherie
          //3eme cas de figure : report de l'effort sur les metiers des autres strategies 
          //ayant le meme engin et ayant metapop comme captures secondaires
          //ATTENTION CE REPORT N A DE SENS QUE SI LES STRATEGIES ONT LE
          //MEME NB D UNITES DE PECHE SINON PB AVEC LES PROPORTIONS
          //on repartit l'effort de metier sur ces metiers (ListeMet)
writeln("cas3:"+ListeMet+", "+metier+", "+strategie);
          Regle_action_lib.repartirEffortDansAutresStrategiesQueMetier(
              p.date,ListeMet,metier,strategie);    
        }
        else{
          // echec du 3eme cas de figure
          // s'il n'y a aucun metier dans la pecherie ayant le meme engin que metier
          // alors on cherche lesmetiers possibles de remplacement dans la pecherie
writeln("cas3 else (cas4 et cas5):["+ListeAllMetiersSaufmetier+"], ["+ListeMetiersVises+"], ["+ListeAllMetiersCaptureSecondaire+"]"); 
        var metderemplacement = Regle_action_lib.NbetListeMetiersRemplacements
                             (ListeAllMetiersSaufmetier,
                              ListeMetiersVises,
                              ListeAllMetiersCaptureSecondaire);
        var NbMet = metderemplacement.NbMet;
        var ListeMet = metderemplacement.ListeMet;
writeln("cas4 et cas5 NbMetierremplacement:"+NbMet);
        // reaction
        if(NbMet>=1){
         // 4eme cas de figure : report de l'effort sur les metiers de la pecherie
writeln("cas4:");
writeln(ListeMet+", "+metier+", "+strategie);
         Regle_action_lib.repartirEffortDansAutresStrategiesQueMetier(
              p.date, ListeMet, metier, strategie);
        }
        else {
         // echec du 4eme cas de figure : pas de metier de remplacement dans la pecherie le metier passe 
         // donc au chomage dans sa strategie
writeln("cas5:"+ListeMet+", "+metier+", "+strategie);
         Regle_action_lib.MettreAuChomageMetierDansSaStrategie(
              p.date,strategie,metier);
        }// fin du echec du 4eme cas de figure (else)
       }// fin du echec du 3eme cas de figure (else)
     }// fin du echec 2eme cas de figure (else)
    }// fin du echec 1er cas de figure (else)
  }// fin du for strategie du metier
}//fin du if capture principale

var lang=MetaPopulationFactory.findByNomEspece("langoustine");
if (p.metapop==lang){
	var benthjum=MetierFactory.findByNom("mtier benth jum");
	var benthsimp=MetierFactory.findByNom("mtier benth simp");
	var merlusimp=MetierFactory.findByNom("mtier merlu-seiche simp");
	var merlujum=MetierFactory.findByNom("mtier merlu-seiche jum");
	var rejetlang=EnginFactory.findByNom("rejet lang");
	var rejetlangjum=EnginFactory.findByNom("rejet lang jumeau");
	benthjum.setEngin("rejetlangjum");
	bentsimp.setEngin("rejetlang");
	merlusimp.setEngin("rejetlang");
	merlujum.setEngin("rejetlangjum");
}

return p.gestionMetier;
}

TacBas.prototype.actionAvant = TacBas_actionAvant;
function TacBas_actionApres(p){
writeln("*$*$*$* TAC.actionApres:"+p.date+" metapop:"+p.metapop+" metier:"+p.metier);
if(! Regle_libUtil.isCapturePrincipaleDate(p.date,p.metapop, p.metier)){    
  writeln("*$*$*$* ok affect capture au rejet");
  // ATTENTION        
  // les captures pour cette metapop ne sont plus du qu'au metier pour qui 
  // l'espece est secondaire: elles sont affectees aux rejets

  //pb : ne se fait pas par metier
  //il faut une matrice pour chaques pas de temps qui stocke les rejets 
  //par metier, par metapop et par classes d'age (comme pour les captures)
  //////
  Regle_action_lib.affecterCaptureRejet(p.date, p.metapop, p.suivie, p.metier);

  //on a affecte une fois cette meta pop au rejet il ne faut pas le refaire
}

return p.gestionMetier;

}

TacBas.prototype.actionApres = TacBas_actionApres;
function TacHaut(param){
this.param = param;

this.p = new Object();

writeln("Init du TAC");
//objet comprenant: TACAn,metapop,dateDeb,dateFin

writeln("recuperation de la meta pop");
this.p.metapop= this.param.getValue("metapop");
this.p.TACAn= 10.0;
this.p.part= this.param.getValue("part");
writeln("valeur de proportion: "+this.p.part);
this.p.changement=false;

writeln("TAC variable sur: "+this.p.metapop);









}

function TacHaut_parametre(date,metier,suivie,gestionMetier){
this.p.metier = metier;
this.p.date = date;
this.p.suivie = suivie;
this.p.gestionMetier = gestionMetier;

}

TacHaut.prototype.parametre = TacHaut_parametre;
function TacHaut_condition(p, oldValue){
// si oldValue existe on est dans la condition pour actionApres.
// il faut donc reprendre oldValue comme valeur de retour
writeln("Recherche si le tac s'applique (oldValue="+oldValue);

var result = false;
writeln ("date= "+p.date.getDate());
if(oldValue != undefined){
  result = oldValue;}



else {  var mois=p.date.getDate();
	var VerifDate=false;
	if (mois==0 || mois==12 || mois==24 || mois==36 || mois==48 || mois==60 || mois==72 || mois==84 || mois==96 || mois==108) {VerifDate=true;}
	if (VerifDate==false) {p.changement=false;}
	else if (VerifDate==true && p.changement==false){
		var biomasse=0.0;
		for (i=0; i<p.suivie.size();i++){
			var current= p.suivie.get(i);
			if(p.metapop.equals(current.getPop().getMetaPopulation())){
				var pop=current.getPop();
				var effectif=current.getN();
				var nbclasse = pop.getClasses().size();
 				var nbzone  = pop.getZonePopulation().getAllSecteur().size();
				for (classe=0; classe<nbclasse; classe++){
					if (classe<nbclasse-1 && mois!=0) {var poids=pop.getClasses.get(classe+1).getPoidsMoyen();}
					else {var poids=pop.getClasses.get(classe).getPoidsMoyen();}
					for (zone=0; zone<nbzone;zone++){
						var y=classe*(nbzone)+zone;
						biomasse= biomasse+effectif.getValue(0,y)*poids/1000.0;
					}
				}
				p.TACAn=p.part*biomasse;
				writeln("anne= "+mois/12+"    biomasse dbut anne= "+biomasse+"     proportion= "+p.part+"    TAC anne= "+p.TACAn);
				p.changement=true;
			}
		}		
	}
	
	writeln ("valeur du TAC= "+p.TACAn);
	if(Regle_action_lib.totalCcumpoids(p.suivie,p.metapop) >=p.TACAn){
		writeln ("TAC atteint");
		if(Regle_libUtil.isCaptureDate(p.date,p.metapop, p.metier)) result = true;}
}
   


writeln("fin de condition TAC:"+result);


return result;

}

TacHaut.prototype.condition = TacHaut_condition;
function TacHaut_actionAvant(p){
writeln("Action avant");
var metier=p.metier;
writeln("le metier vise par le tac : "+metier);
var metiernonactivite = Regle_libUtil.getMetierNonActivite();

if(Regle_libUtil.isCapturePrincipaleDate(p.date,p.metapop, p.metier)){
     // on recupere les strategies qui contiennent ce metier
  var ListeStrategiesDuMetierViseAdate= 
      Regle_libUtil.getStrategiesMetierDate(p.date,p.metier);

  var ListeMetiersVises = Regle_libUtil.getMetiersVises(p.date,p.metapop);

  // 1er cas de figure : report sur les metiers de la strategie qui ont le meme engin	
			
  for (var s=0;s<ListeStrategiesDuMetierViseAdate.length;s++) {
    // pour chaque strategie contenant le metier vise metier
    var strategie=ListeStrategiesDuMetierViseAdate[s];
    writeln("strategie du metier vise "+metier+" par le tac :"+strategie);
    // liste des metiers ayant la metapop comme capture secondaire dans strategie
    var ListeMetiersDeLaStrategieCaptureSecondaire =
          Regle_libUtil.getMetiersSecondaireDateStr(p.date,strategie,p.metapop);
    // liste des metiers de la strategie sauf metier
    var ListeMetiersDeLaStrategieSaufmetier=
         Regle_libUtil.getMetiersStrategieDateSauf1(p.date,metier,strategie);
writeln(" cas 1["+ListeMetiersDeLaStrategieSaufmetier+"], ["+ListeMetiersVises+"], ["+ListeMetiersDeLaStrategieCaptureSecondaire+"]"); 
    var metderemplacement = Regle_action_lib.NbetListeMetiersRemplacementsAvecEngin
                             (metier,ListeMetiersDeLaStrategieSaufmetier,
                              ListeMetiersVises,
                              ListeMetiersDeLaStrategieCaptureSecondaire);
    var NbMet = metderemplacement.NbMet;
    var ListeMet = metderemplacement.ListeMet;
writeln("cas 1 NbMetremplacement :"+NbMet);
    // reaction
    if (NbMet>=1) {//s'il y a au moins 1 metier de remplacement dans la strategie
      //1er cas de figure : report de l'effort
      // on repartit l'effort de metier sur ces metiers (ListeMet)
writeln("cas1:"+ListeMet+", "+metier+", "+strategie);
      Regle_action_lib.repartirEffortDansMemeStrategieQueMetier(
          p.date,strategie, ListeMet, metier);
    }
    else {
      //echec 1er cas figure: s'il n'y a aucun metier dans la strategie qui ait le meme engin 
      // pour chaque strategie contenant le metier vise metier
writeln(" cas 2 ["+ListeMetiersDeLaStrategieSaufmetier+"], ["+ListeMetiersVises+"], ["+ListeMetiersDeLaStrategieCaptureSecondaire+"]");     
     var metderemplacement = Regle_action_lib.NbetListeMetiersRemplacements
                             (ListeMetiersDeLaStrategieSaufmetier,
                              ListeMetiersVises,
                              ListeMetiersDeLaStrategieCaptureSecondaire);
     var NbMet = metderemplacement.NbMet;
     var ListeMet = metderemplacement.ListeMet;
writeln("cas 2 NbMetremplacement :"+NbMet);
      // reaction
     if (NbMet>=1) {//s'il y a au moins 1 metier de remplacement dans la strategie
        //2eme cas de figure : report de l'effort
        // on repartit l'effort de metier sur ces metiers (ListeMet)
writeln("cas2:"+ListeMet+", "+metier+", "+strategie);
        Regle_action_lib.repartirEffortDansMemeStrategieQueMetier(
            p.date,strategie, ListeMet, metier);
      }
      else{ // s'il n'y a pas de metier de remplacement dans strategie
       // echec 2eme cas de figure : report sur les metiers des autres strategies
       // initialisations
    
       // remplacements possibles
       // liste des metiers ayant la metapop comme capture secondaire dans toutes
       // les autres strategies
       // cette liste ne comprend pas les metiers qui ne peuvent
       // capturer metapop
       var ListeAllMetiersCaptureSecondaire =
           Regle_libUtil.getAllMetiersSecondaireDateSaufStr(p.date,strategie,p.metapop);
       // dans la liste des metiers de remplacement, il faut 
       // rajouter les metiers qui ne capturent pas l'espece
       var ListeAllMetiersSaufmetier=Regle_libUtil.getAllMetiersSauf1Date(p.date,p.metier);
writeln(" cas 3 ["+ListeAllMetiersSaufmetier+"], ["+ListeMetiersVises+"], ["+ListeAllMetiersCaptureSecondaire+"]");
       var metderemplacement = Regle_action_lib.NbetListeMetiersRemplacementsAvecEngin
                             (metier,ListeAllMetiersSaufmetier,
                              ListeMetiersVises,
                              ListeAllMetiersCaptureSecondaire);
       var NbMet = metderemplacement.NbMet;
       var ListeMet = metderemplacement.ListeMet;
writeln("cas 3 NbMetremplacement :"+NbMet);
        // reaction
       if (NbMet>=1) {
          //s'il y a au moins 1 metier de remplacement dans la pecherie
          //3eme cas de figure : report de l'effort sur les metiers des autres strategies 
          //ayant le meme engin et ayant metapop comme captures secondaires
          //ATTENTION CE REPORT N A DE SENS QUE SI LES STRATEGIES ONT LE
          //MEME NB D UNITES DE PECHE SINON PB AVEC LES PROPORTIONS
          //on repartit l'effort de metier sur ces metiers (ListeMet)
writeln("cas3:"+ListeMet+", "+metier+", "+strategie);
          Regle_action_lib.repartirEffortDansAutresStrategiesQueMetier(
              p.date,ListeMet,metier,strategie);    
        }
        else{
          // echec du 3eme cas de figure
          // s'il n'y a aucun metier dans la pecherie ayant le meme engin que metier
          // alors on cherche lesmetiers possibles de remplacement dans la pecherie
writeln("cas3 else (cas4 et cas5):["+ListeAllMetiersSaufmetier+"], ["+ListeMetiersVises+"], ["+ListeAllMetiersCaptureSecondaire+"]"); 
        var metderemplacement = Regle_action_lib.NbetListeMetiersRemplacements
                             (ListeAllMetiersSaufmetier,
                              ListeMetiersVises,
                              ListeAllMetiersCaptureSecondaire);
        var NbMet = metderemplacement.NbMet;
        var ListeMet = metderemplacement.ListeMet;
writeln("cas4 et cas5 NbMetierremplacement:"+NbMet);
        // reaction
        if(NbMet>=1){
         // 4eme cas de figure : report de l'effort sur les metiers de la pecherie
writeln("cas4:");
writeln(ListeMet+", "+metier+", "+strategie);
         Regle_action_lib.repartirEffortDansAutresStrategiesQueMetier(
              p.date, ListeMet, metier, strategie);
        }
        else {
         // echec du 4eme cas de figure : pas de metier de remplacement dans la pecherie le metier passe 
         // donc au chomage dans sa strategie
writeln("cas5:"+ListeMet+", "+metier+", "+strategie);
         Regle_action_lib.MettreAuChomageMetierDansSaStrategie(
              p.date,strategie,metier);
        }// fin du echec du 4eme cas de figure (else)
       }// fin du echec du 3eme cas de figure (else)
     }// fin du echec 2eme cas de figure (else)
    }// fin du echec 1er cas de figure (else)
  }// fin du for strategie du metier
}//fin du if capture principale

var lang=MetaPopulationFactory.findByNomEspece("langoustine");
if (p.metapop==lang){
	var benthjum=MetierFactory.findByNom("mtier benth jum");
	var benthsimp=MetierFactory.findByNom("mtier benth simp");
	var merlusimp=MetierFactory.findByNom("mtier merlu-seiche simp");
	var merlujum=MetierFactory.findByNom("mtier merlu-seiche jum");
	var rejetlang=EnginFactory.findByNom("rejet lang");
	var rejetlangjum=EnginFactory.findByNom("rejet lang jumeau");
	benthjum.setEngin("rejetlangjum");
	bentsimp.setEngin("rejetlang");
	merlusimp.setEngin("rejetlang");
	merlujum.setEngin("rejetlangjum");
}

return p.gestionMetier;
}

TacHaut.prototype.actionAvant = TacHaut_actionAvant;
function TacHaut_actionApres(p){
writeln("*$*$*$* TAC.actionApres:"+p.date+" metapop:"+p.metapop+" metier:"+p.metier);
if(! Regle_libUtil.isCapturePrincipaleDate(p.date,p.metapop, p.metier)){    
  writeln("*$*$*$* ok affect capture au rejet");
  // ATTENTION        
  // les captures pour cette metapop ne sont plus du qu'au metier pour qui 
  // l'espece est secondaire: elles sont affectees aux rejets

  //pb : ne se fait pas par metier
  //il faut une matrice pour chaques pas de temps qui stocke les rejets 
  //par metier, par metapop et par classes d'age (comme pour les captures)
  //////
  Regle_action_lib.affecterCaptureRejet(p.date, p.metapop, p.suivie, p.metier);

  //on a affecte une fois cette meta pop au rejet il ne faut pas le refaire
}

return p.gestionMetier;

}

TacHaut.prototype.actionApres = TacHaut_actionApres;
function cantEnginS1(param){
var StringBuffer = Packages.java.lang.StringBuffer;
var Date = Packages.fr.ifremer.nodb.Date;
var XMLUtil = Packages.org.codelutin.xml.XMLUtil;

this.param = param;

//construction de p
this.p = new Object();
this.p.paramRegle = this.param;

//la zone d'application du ChtParamControlable
this.p.zone= this.param.getValue("zone");
writeln("zone:"+this.p.zone);

//les mailles de la zone d'application du ChtParamControal
this.p.mailles = this.p.zone.getMaille();

this.p.dateDeb=this.param.getValue("dateDeb");
this.p.dateFin=this.param.getValue("dateFin");

this.p.moisDeb=this.param.getValue("moisDeb");
this.p.moisFin=this.param.getValue("moisFin");

//l'engin affecte par le mesure
//nouvel engin (=engin si la nouvelle valeur sort de la gamme d'engin)
// et la nouvelle valeur du parametre controlable
this.p.engin=this.param.getValue("engin");
this.p.nouvelEngin=this.param.getValue("nouvelEngin");
this.p.valParam=this.param.getValue("valParam");


}

function cantEnginS1_parametre(date,metier,suivie,gestionMetier){
//metier courant de la boucle sur les metiers
this.p.metier = metier;
//date courante
this.p.date = date;
//vecteurs des parametres courants de chaque pop : effectifs, captures, rejets,...
// fr.ifremer.Simulation.Simulationsuivi
this.p.suivie = suivie;
// ensemble de metiers modifies et affectes a des groupes (cf maude pour Licence)
this.p.gestionMetier = gestionMetier;

}

cantEnginS1.prototype.parametre = cantEnginS1_parametre;
function cantEnginS1_condition(p, oldValue){
writeln("condition fermeture zone");
var mois = p.date.getMois().getNumMois();
writeln("mois:"+mois);
if(!(p.moisDeb<=mois && mois<=p.moisFin))
  return false;
writeln("on est dans l'espace des mois possible");
//on est dans l'espace des mois possible
if(p.date.before(p.dateDeb))
  return false;
if(p.date.after(p.dateFin))
  return false;

//s'il utilise le meme engin
if (!p.metier.getEngin().equals(p.engin)) 
  return false;

// s'il y a une intersection avec la zone de chtdeparam, alors la regle s'applique
var mailleMetier = p.metier.getSecteurMois(p.date.getMois()).getMaille();
mailleMetier.retainAll(p.mailles)
var result = mailleMetier.size() != 0;


if(result)
  writeln("===== ChangementParamControlable s'applique ======");
return result;

}

cantEnginS1.prototype.condition = cantEnginS1_condition;
function cantEnginS1_actionAvant(p){
writeln("ChangementParamControlable Action avant metier:"+p.metier);
writeln("L'engin affecte est:"+p.engin);

writeln("La valeur du parametre controlable est:"+p.valParam);

//modification de metier 
//avec metier.engin = nouvelEngin
// et metier.val=valParam
// et le reste inchange
 p.metier.setEngin(p.nouvelEngin);
 p.metier.setValeurParamControlable(p.valParam);


writeln("fin ChangementParamControlable action avant");
return p.gestionMetier;
}

cantEnginS1.prototype.actionAvant = cantEnginS1_actionAvant;
function cantEnginS1_actionApres(p){
writeln("Action apres");
return p.gestionMetier;
}

cantEnginS1.prototype.actionApres = cantEnginS1_actionApres;
function cantEnginS1S2(param){
var StringBuffer = Packages.java.lang.StringBuffer;
var Date = Packages.fr.ifremer.nodb.Date;
var XMLUtil = Packages.org.codelutin.xml.XMLUtil;

this.param = param;

//construction de p
this.p = new Object();
this.p.paramRegle = this.param;

//la zone d'application du ChtParamControlable
this.p.zone= this.param.getValue("zone");
writeln("zone:"+this.p.zone);

//les mailles de la zone d'application du ChtParamControal
this.p.mailles = this.p.zone.getMaille();

this.p.dateDeb=this.param.getValue("dateDeb");
this.p.dateFin=this.param.getValue("dateFin");

this.p.moisDeb=this.param.getValue("moisDeb");
this.p.moisFin=this.param.getValue("moisFin");

//l'engin affecte par le mesure
//nouvel engin (=engin si la nouvelle valeur sort de la gamme d'engin)
// et la nouvelle valeur du parametre controlable
this.p.engin=this.param.getValue("engin");
this.p.nouvelEngin=this.param.getValue("nouvelEngin");
this.p.valParam=this.param.getValue("valParam");


}

function cantEnginS1S2_parametre(date,metier,suivie,gestionMetier){
//metier courant de la boucle sur les metiers
this.p.metier = metier;
//date courante
this.p.date = date;
//vecteurs des parametres courants de chaque pop : effectifs, captures, rejets,...
// fr.ifremer.Simulation.Simulationsuivi
this.p.suivie = suivie;
// ensemble de metiers modifies et affectes a des groupes (cf maude pour Licence)
this.p.gestionMetier = gestionMetier;

}

cantEnginS1S2.prototype.parametre = cantEnginS1S2_parametre;
function cantEnginS1S2_condition(p, oldValue){
writeln("condition fermeture zone");
var mois = p.date.getMois().getNumMois();
writeln("mois:"+mois);
if(!(p.moisDeb<=mois && mois<=p.moisFin))
  return false;
writeln("on est dans l'espace des mois possible");
//on est dans l'espace des mois possible
if(p.date.before(p.dateDeb))
  return false;
if(p.date.after(p.dateFin))
  return false;

//s'il utilise le meme engin
if (!p.metier.getEngin().equals(p.engin)) 
  return false;

// s'il y a une intersection avec la zone de chtdeparam, alors la regle s'applique
var mailleMetier = p.metier.getSecteurMois(p.date.getMois()).getMaille();
mailleMetier.retainAll(p.mailles)
var result = mailleMetier.size() != 0;


if(result)
  writeln("===== ChangementParamControlable s'applique ======");
return result;

}

cantEnginS1S2.prototype.condition = cantEnginS1S2_condition;
function cantEnginS1S2_actionAvant(p){
writeln("ChangementParamControlable Action avant metier:"+p.metier);
writeln("L'engin affecte est:"+p.engin);

writeln("La valeur du parametre controlable est:"+p.valParam);

//modification de metier 
//avec metier.engin = nouvelEngin
// et metier.val=valParam
// et le reste inchange
 p.metier.setEngin(p.nouvelEngin);
 p.metier.setValeurParamControlable(p.valParam);


writeln("fin ChangementParamControlable action avant");
return p.gestionMetier;
}

cantEnginS1S2.prototype.actionAvant = cantEnginS1S2_actionAvant;
function cantEnginS1S2_actionApres(p){
writeln("Action apres");
return p.gestionMetier;
}

cantEnginS1S2.prototype.actionApres = cantEnginS1S2_actionApres;
function cantEnginS2(param){
var StringBuffer = Packages.java.lang.StringBuffer;
var Date = Packages.fr.ifremer.nodb.Date;
var XMLUtil = Packages.org.codelutin.xml.XMLUtil;

this.param = param;

//construction de p
this.p = new Object();
this.p.paramRegle = this.param;

//la zone d'application du ChtParamControlable
this.p.zone= this.param.getValue("zone");
writeln("zone:"+this.p.zone);

//les mailles de la zone d'application du ChtParamControal
this.p.mailles = this.p.zone.getMaille();

this.p.dateDeb=this.param.getValue("dateDeb");
this.p.dateFin=this.param.getValue("dateFin");

this.p.moisDeb=this.param.getValue("moisDeb");
this.p.moisFin=this.param.getValue("moisFin");

//l'engin affecte par le mesure
//nouvel engin (=engin si la nouvelle valeur sort de la gamme d'engin)
// et la nouvelle valeur du parametre controlable
this.p.engin=this.param.getValue("engin");
this.p.nouvelEngin=this.param.getValue("nouvelEngin");
this.p.valParam=this.param.getValue("valParam");


}

function cantEnginS2_parametre(date,metier,suivie,gestionMetier){
//metier courant de la boucle sur les metiers
this.p.metier = metier;
//date courante
this.p.date = date;
//vecteurs des parametres courants de chaque pop : effectifs, captures, rejets,...
// fr.ifremer.Simulation.Simulationsuivi
this.p.suivie = suivie;
// ensemble de metiers modifies et affectes a des groupes (cf maude pour Licence)
this.p.gestionMetier = gestionMetier;

}

cantEnginS2.prototype.parametre = cantEnginS2_parametre;
function cantEnginS2_condition(p, oldValue){
writeln("condition fermeture zone");
var mois = p.date.getMois().getNumMois();
writeln("mois:"+mois);
if(!(p.moisDeb<=mois && mois<=p.moisFin))
  return false;
writeln("on est dans l'espace des mois possible");
//on est dans l'espace des mois possible
if(p.date.before(p.dateDeb))
  return false;
if(p.date.after(p.dateFin))
  return false;

//s'il utilise le meme engin
if (!p.metier.getEngin().equals(p.engin)) 
  return false;

// s'il y a une intersection avec la zone de chtdeparam, alors la regle s'applique
var mailleMetier = p.metier.getSecteurMois(p.date.getMois()).getMaille();
mailleMetier.retainAll(p.mailles)
var result = mailleMetier.size() != 0;


if(result)
  writeln("===== ChangementParamControlable s'applique ======");
return result;

}

cantEnginS2.prototype.condition = cantEnginS2_condition;
function cantEnginS2_actionAvant(p){
writeln("ChangementParamControlable Action avant metier:"+p.metier);
writeln("L'engin affecte est:"+p.engin);

writeln("La valeur du parametre controlable est:"+p.valParam);

//modification de metier 
//avec metier.engin = nouvelEngin
// et metier.val=valParam
// et le reste inchange
 p.metier.setEngin(p.nouvelEngin);
 p.metier.setValeurParamControlable(p.valParam);


writeln("fin ChangementParamControlable action avant");
return p.gestionMetier;
}

cantEnginS2.prototype.actionAvant = cantEnginS2_actionAvant;
function cantEnginS2_actionApres(p){
writeln("Action apres");
return p.gestionMetier;
}

cantEnginS2.prototype.actionApres = cantEnginS2_actionApres;

	at org.codelutin.ecmascript.Global.evaluateString(Global.java:129)
	at fr.ifremer.simulator.Simulator.simulate(Simulator.java:217)
	... 4 more
Caused by: FESI.Exceptions.EcmaScriptParseException: Syntax error detected near line 313, column 9, after <IDENTIFIER>
in string starting with: 'function CantonnementAnnee(param){'...
	at FESI.Interpreter.Evaluator.evaluate(Evaluator.java:919)
	at FESI.Interpreter.Evaluator.evaluate(Evaluator.java:1062)
	at FESI.Interpreter.Evaluator.evaluate(Evaluator.java:1033)
	at org.codelutin.ecmascript.Global.evaluateString(Global.java:124)
	... 5 more
fin de simulation Wed Aug 17 12:58:47 CEST 2005: (Memoire libre/Memoire Total = 174688944/314974208)