1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293
|
package model;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.velocity.tools.generic.MathTool;
import velosurf.context.AttributeReference;
import velosurf.context.DBReference;
import velosurf.context.Instance;
import tool.BoxtaleTool;
import tool.ReglementTool;
import util.BoxtaleLogger;
import util.BoxtaleUtils;
public class User extends Instance {
protected static MathTool math = new MathTool();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// retourne l'en-cours d'un utilisateur
public float getEncours() {
// Sauvegarde des anciennes valeurs qu'on remettra en place par la suite.
Object o1 = get("begin");
Object o2 = get("end");
// on met la date du jour pour recuperer le dernier encours sauvegardé
put("begin", sdf.format(new Date()));
Instance solde_prec = (Instance)get("solde_periode_precedente");
if(solde_prec != null) {
Calendar c = Calendar.getInstance();
c.setTime((Date)solde_prec.get("date_solde"));
c.add(Calendar.DAY_OF_MONTH, 1);
put("begin", sdf.format(c.getTime()));
} else {
put("begin", sdf.format((Date)get("date_creation")));
}
put("end", sdf.format(new Date()));
float f = new ReglementTool().getSolde(this);
// on remet en place les anciennes valeurs
if(o1 != null) put("begin", o1);
if(o2 != null) put("end", o2);
return f;
}
public float getEncoursFacture() {
float encours = (float)0.0;
AttributeReference ar = (AttributeReference)get("factures_non_payees");
for(Object o:ar) {
if(!(o instanceof Facture)) continue; // todo : msg d'alerte
encours += ((Facture)o).getMontantDu();
}
return encours;
}
public float getEncoursNonFacture() {
float encours = (float)0.0;
Facture f = (Facture)get("facture_en_cours");
if(f != null) {
encours += f.getMontant(true);
}
return encours;
}
// indique si avec la commande actuelle, on depasse ou non le seuil maximal autorise
public boolean depassementAutoriseAtteint(float prix) {
return (getEncours() + prix > (Float)get("encours_autorise"));
}
// NOTE : pas utile mais au cas ou j'aurais oublie un appel à updateMailConfiguration...
public void updateMailConfiguration(String exp, String dst, String fact) {
// on conserve la valeur du champ prelevement.
updateMailConfiguration(exp, dst, fact, isPrelEmailActivated() ? "a" : "");
}
public void updateMailConfiguration(String exp, String dst, String fact, String prel) {
if(exp.length() > 0) activateExpEmail(); else deactivateExpEmail();
if(dst.length() > 0) activateDstEmail(); else deactivateDstEmail();
if(fact.length() > 0) activateFactEmail(); else deactivateFactEmail();
if(prel.length() > 0) activatePrelEmail(); else deactivatePrelEmail();
this.update();
}
public boolean isExpEmailActivated() { return (((Integer)get("email_configuration") & BoxtaleTool.getMAIL_EXPEDITEUR()) != 0); }
public boolean isDstEmailActivated() { return (((Integer)get("email_configuration") & BoxtaleTool.getMAIL_DESTINATAIRE()) != 0); }
public boolean isFactEmailActivated() { return (((Integer)get("email_configuration") & BoxtaleTool.getMAIL_PAYEUR()) != 0); }
public boolean isPrelEmailActivated() { return (((Integer)get("email_configuration") & BoxtaleTool.getMAIL_PRELEVEMENT()) != 0); }
public void activateExpEmail() { put("email_configuration", (Integer)get("email_configuration") | BoxtaleTool.getMAIL_EXPEDITEUR()); }
public void activateDstEmail() { put("email_configuration", (Integer)get("email_configuration") | BoxtaleTool.getMAIL_DESTINATAIRE()); }
public void activateFactEmail() { put("email_configuration", (Integer)get("email_configuration") | BoxtaleTool.getMAIL_PAYEUR()); }
public void activatePrelEmail() { put("email_configuration", (Integer)get("email_configuration") | BoxtaleTool.getMAIL_PRELEVEMENT()); }
public void deactivateExpEmail() { put("email_configuration", (Integer)get("email_configuration") & (0xFFFFFFFF ^ BoxtaleTool.getMAIL_EXPEDITEUR()) ); }
public void deactivateDstEmail() { put("email_configuration", (Integer)get("email_configuration") & (0xFFFFFFFF ^ BoxtaleTool.getMAIL_DESTINATAIRE()) ); }
public void deactivateFactEmail() { put("email_configuration", (Integer)get("email_configuration") & (0xFFFFFFFF ^ BoxtaleTool.getMAIL_PAYEUR()) ); }
public void deactivatePrelEmail() { put("email_configuration", (Integer)get("email_configuration") & (0xFFFFFFFF ^ BoxtaleTool.getMAIL_PRELEVEMENT()) ); }
// methode utilitaire pour recuperer un compte operateur lie à cet utilisateur
public Instance getOpeInfos(String ope_code) {
return getOpeInfos(ope_code, null);
}
public Instance getOpeInfos(String ope_code, String srv_code) {
put("ope_code", ope_code);
if(srv_code != null) put("srv_code", srv_code);
return (Instance)get("ope_account");
}
// recupère l'éventuel compte operateur du client puis effectue qqs verifications (cp d'enlèvement, ...)
public boolean hasOperateurAccount(Offre o, Envoi e) {
return hasOperateurAccount(o, e, true);
}
//
public boolean hasOperateurAccount(Offre o, Envoi e, boolean checkDays) {
String srv_code = (String)o.get("srv_code");
if(srv_code.endsWith("SY")) srv_code = srv_code.substring(0, srv_code.length()-2);
Instance i = getOpeInfos((String)((Instance)o.get("operateur")).get("ope_code"), srv_code);
BoxtaleLogger.debug("[User.hasOperateurAccount] "+ get("login") + " - "+ ((Instance)o.get("operateur")).get("ope_code") + " - "+ o.get("srv_code") +" (considering "+srv_code+") ------> "+ i);
// Si l'utilisateur n'a pas de compte, rien ne sert de continuer
if(i == null) return false;
// Verification du codepostal s'il est non null
String cp = (String)i.get("codepostal");
if(cp != null && cp.compareTo((String)((Instance)e.get("expediteur")).get("codepostal")) != 0) return false;
String numero = (String)i.get("numero");
if(numero == null || numero.trim().length() == 0) return false;
if(checkDays) {
Calendar DEP = (Calendar)o.get("DEP");
// DEP peut etre nul si on arrive du backoffice.
if(DEP == null || !isPickupDay((String)((Instance)o.get("operateur")).get("ope_code"), DEP.get(Calendar.DAY_OF_WEEK))) return false;
}
return true;
}
// Retourne le numero du compte que l'utilisateur possede chez l'operateur
public String getOpeAccount(String ope_code) {
Instance i = getOpeInfos(ope_code);
return i != null ? (String)i.get("numero") : null;
}
// Indique si une offre est ouverte au pickup le jour donné
public boolean isPickupDay(String ope_code, int jour) {
Instance i = getOpeInfos(ope_code);
if(i == null) return false;
String key = getJourKey(jour);
if(key != null) return (Boolean)i.get(key);
return false;
}
public boolean setPickupDays(String ope_code, Map<String, Object> m) {
Instance infos = getOpeInfos(ope_code);
if(infos == null) return false;
try {
for(int i = Calendar.MONDAY; i<=Calendar.SATURDAY; i++) {
if(m.get(""+i) != null) infos.put(getJourKey(i), true);
else infos.put(getJourKey(i), false);
}
return infos.update();
} catch(Exception e) {
BoxtaleLogger.log("[User.setPickupDays] Une erreur est survenue lors de la mise a jour des jours de pickup pour "+ get("login") + " - "+ope_code+" - "+ m, e);
}
return false;
}
protected String getJourKey(int jour) {
switch(jour) {
case Calendar.MONDAY: return "lundi";
case Calendar.TUESDAY: return "mardi";
case Calendar.WEDNESDAY: return "mercredi";
case Calendar.THURSDAY: return "jeudi";
case Calendar.FRIDAY: return "vendredi";
case Calendar.SATURDAY: return "samedi";
default: return null;
}
}
/**
* Gestion du markup spécifique à l'utilisateur
*
*/
public Float getMarkup(Offre o) {
// pas d'offre spécifiée, on ne peut pas récuupérer le markup.
// TODO : error msg ?!?
if(o == null) return null;
put("ope_code", ((Instance)o.get("operateur")).get("ope_code"));
put("srv_code", o.get("srv_code"));
Instance i = (Instance)super.get("operateur_service_markup");
if(i != null) return (Float)i.get("markup");
else return null;
}
// Suivant les machines assurance tinyint(1) est considéré comme un entier ou comme un booleen
// on uniformise le comportement.
public Boolean getAssurance() {
Object o = super.get("assurance");
if(o instanceof Integer) return (Integer)o != 0;
else if(o instanceof Boolean) return (Boolean)o;
return true; // default
}
// Quelques methodes pour faciliter le calcul de stats
public List<Instance> getListRemunerationVendeur() {
List<Instance> result = new ArrayList<Instance>();
DBReference db = BoxtaleUtils.getDBReference();
Instance vendeur = (Instance)get("vendeur");
//BoxtaleLogger.debug("[User.getListRemunerationVendeur] @@@ Vendeur : "+ vendeur);
if(vendeur == null) return null;
List<Instance> envois = ((AttributeReference)get("envois_sur_periode")).getRows();
for(Instance e:envois) {
Integer etat = (Integer)e.get("envoi_etat");
if(etat < 1 && etat != -4 && etat != -10) continue;
//BoxtaleLogger.debug("[User.getListRemunerationVendeur] @@@ Considering : "+ e.get("envoi_numfact")+e.get("envoi_reference"));
String envoi_service = (String)e.get("envoi_service");
db.put("ope", ((String)e.get("envoi_reference")).substring(0,4));
Instance operateur = (Instance)db.get("operateur_by_code");
db.put("ope_id", operateur.get("ope_id"));
db.put("srv", envoi_service.substring(envoi_service.lastIndexOf(" ")+1));
Instance service = (Instance)db.get("service_by_code");
vendeur.put("ope_code", operateur.get("ope_code"));
vendeur.put("srv_code", service.get("srv_code"));
Instance rem = (Instance)vendeur.get("remuneration_ope_srv");
//BoxtaleLogger.debug("[User.getListRemunerationVendeur] @@@ Operateur : "+ operateur.get("ope_code")+" - service : "+ service.get("srv_code")+" - remuneration vendeur : "+ rem);
if(rem == null) continue;
Float remuneration_base = (Float)e.get("envoi_prix_nego_precond")+(Float)e.get("envoi_com");
Float remuneration = (float)0.0;
if(rem.get("fixe") != null) {
remuneration = (Float)rem.get("fixe");
} else {
remuneration = ((Double)math.roundTo(2, remuneration_base * (Float)rem.get("pourcent") / (float)100.0)).floatValue();
}
e.put("remuneration_base", remuneration_base);
e.put("remuneration", remuneration);
result.add(e);
}
return result;
}
public Float getBaseRemunerationVendeur() {
List<Instance> l = getListRemunerationVendeur();
if(l == null || l.size() == 0) return (float)0.0;
float rem = (float)0.0;
for(Instance e:l) {
rem += (Float)e.get("remuneration_base");
}
return rem;
}
public Float getRemunerationVendeur() {
List<Instance> l = getListRemunerationVendeur();
if(l == null || l.size() == 0) return (float)0.0;
float rem = (float)0.0;
for(Instance e:l) {
rem += (Float)e.get("remuneration");
}
return rem;
}
// Indique si un utilisateur dispose d'une assurance spécifique
// sur le type contenu passé en paramètre.
public boolean hasSpecificInsurance(int cont_id) {
return getSpecificInsuranceInfo(cont_id) != null;
}
// Retourne les informations d'assurance sur le contenu si elles existent
// ou null si ce n'est pas le cas.
public Map getSpecificInsuranceInfo(int cont_id) {
put("cont_id", cont_id);
return (Map)getWithParams("assurance_by_contenu", this);
}
} |
Partager