package fr.chantier.tapestry.pages.commandes;
import fr.chantier.enumeration.Mois;
import fr.chantier.model.*;
import fr.chantier.service.*;
import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.Link;
import org.apache.tapestry5.annotations.*;
import org.apache.tapestry5.beaneditor.BeanModel;
import org.apache.tapestry5.corelib.components.Form;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.services.BeanModelSource;
import org.apache.tapestry5.services.Response;
import java.io.IOException;
import java.util.*;
/**
* Created by IntelliJ IDEA.
* User: sora
* Date: Oct 28, 2008
* Time: 3:55:25 PM
* To change this template use File | Settings | File Templates.
*/
public class ModificationCommandes {
/* Managers */
@Inject
private CommandesManager commandesManager;
@Inject
private IntervenantsManager intervenantsManager;
@Inject
private ClientsManager clientsManager;
@Inject
private SousTraitantsManager sousTraitantsManager;
@Inject
private HistoriqueHeuresManager historiqueHeuresManager;
@Inject
private HistoriqueSommeManager historiqueSommeManager;
@Inject
private ComponentResources resources;
@Inject
private BeanModelSource beanModelSource;
private boolean toPassivate;
/**
* Boolean d'etat de la page
*/
@Property
private boolean isModification;
@Persist
@Property
private boolean isDisplayHeure;
@Persist
@Property
private boolean isDisplaySommes;
/**
* Model pour le beaneditform
*/
@Property
@Retain
private BeanModel<CommandesEntity> beanModel;
/**
* Liste des intervenants
*/
@Property(write = false)
private Collection<IntervenantsEntity> listeIntervenants;
/**
* Liste des clients
*/
@Property(write = false)
private Collection<ClientsEntity> listeClients;
/**
* Liste des sous-traitants
*/
@Property(write = false)
private Collection<SousTraitantsEntity> listSousTraitants;
/* Entites individuelles */
@Property
private IntervenantsEntity intervenantsEntity;
@Property
private SousTraitantsEntity sousTraitantsEntity;
@Property
@Persist
private CommandesEntity commandesEntity;
@Property
private Float heuresSelected;
@Property
private Integer minutesSelected;
@Property
private Float sommeSelected;
@Property
private Mois mois;
@Property
private Integer annee;
/**
* Model pour le select
*/
@Property
private Map<Integer, String> modelSelectClient;
/**
* Resultat du select
*/
@Property
private Integer idClient;
/**
* Identifiant de la commande
*/
private Integer idCommande;
/**
* Liste de historique heures a persister
*/
private Collection<HistoriqueHeuresEntity> listHeureToPersist;
/**
* Liste de historique somme a persister
*/
private Collection<HistoriqueSommeEntity> listSommesToPersist;
private Calendar cal;
@Inject
private Response response;
/**
* Resultat de la recherche par Identifiant
*/
@Property
private Integer inputSearch;
/**
* Initialisation du model
*/
@PageLoaded
private void onPageLoaded() {
beanModel = beanModelSource.create(CommandesEntity.class, true, resources.getMessages());
beanModel.add("client", null);
beanModel.add("historiqueHeures", null);
beanModel.add("historiqueSommes", null);
beanModel.reorder("client", "commandDevis", "commandLibelle", "commandDate", "historiqueHeures", "historiqueSommes");
}
/**
* A l'activation
*
* @param idCommande
*/
@OnEvent("activate")
private void onActivate(Integer idCommande) {
try {
this.idCommande = idCommande;
} catch (NumberFormatException e) {
redirectUser();
}
}
/**
* Initialisation des variables
*/
@SetupRender
private void onSetupRender() {
listeClients = clientsManager.findAllExisting();
listeIntervenants = intervenantsManager.findAllExisting();
listSousTraitants = sousTraitantsManager.findAllExisting();
cal = new GregorianCalendar();
if (idCommande != null) {
isModification = true;
commandesEntity = commandesManager.findById(idCommande);
if (commandesEntity == null) {
redirectUser();
}
idClient = commandesEntity.getClientsByClientId().getClientId();
cal.setTime(commandesEntity.getCommandDate());
} else {
commandesEntity = null;
}
annee = cal.get(Calendar.YEAR);
mois = Mois.lookup(cal.get(Calendar.MONTH));
this.initModel();
}
private void redirectUser() {
try {
response.sendRedirect("");
} catch (IOException e1) {
e1.printStackTrace();
}
}
/**
* Initialise le model pour le select du client
*/
private void initModel() {
modelSelectClient = new LinkedHashMap<Integer, String>();
Collection<ClientsEntity> listClients = clientsManager.findAllExisting();
for (ClientsEntity listClient : listClients) {
modelSelectClient.put(listClient.getClientId(), listClient.getClientName());
}
}
/**
* Prepare les listes temporaires
*/
@OnEvent(component = "commandesForm", value = Form.PREPARE_FOR_SUBMIT)
private void onPrepareforSubmit() {
listHeureToPersist = new ArrayList<HistoriqueHeuresEntity>();
listSommesToPersist = new ArrayList<HistoriqueSommeEntity>();
}
/**
* Traitement du formulaire
*/
@OnEvent(component = "commandesForm", value = Form.SUCCESS)
private Object onSuccessFromCommandesForm() {
if (commandesEntity.getCommandDevis() == null)
commandesEntity.setCommandDevis(0.f);
cal = new GregorianCalendar();
if (mois.getI() != cal.get(Calendar.MONTH) || annee != cal.get(Calendar.YEAR)) {
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.set(Calendar.MONTH, mois.getI());
cal.set(Calendar.YEAR, annee);
}
commandesEntity.setCommandDate(cal.getTime());
ClientsEntity clientsEntity = clientsManager.findById(idClient, false);
commandesEntity.setClientsByClientId(clientsEntity);
commandesEntity = commandesManager.makePersistent(commandesEntity);
for (HistoriqueHeuresEntity historiqueHeuresEntity : listHeureToPersist) {
historiqueHeuresManager.makePersistent(historiqueHeuresEntity);
}
for (HistoriqueSommeEntity historiqueSommeEntity : listSommesToPersist) {
historiqueSommeManager.makePersistent(historiqueSommeEntity);
}
return resources.createPageLink(ModificationCommandes.class, false, commandesEntity.getCommandId());
}
/**
* Recupere les heures et minutes de l'intervenants pour la commande donnee
*
* @return
*/
public String getHeuresEtMinutes() {
Float res = intervenantsManager.getSumOfHoursForCommand(intervenantsEntity, commandesEntity);
return formatHeuresEtMinutes(res);
}
private String formatHeuresEtMinutes(Float heuresFloat) {
int heures;
int minutes;
heures = (int) Math.floor(heuresFloat);
minutes = (int) ((heuresFloat - heures) * 60);
return heures + " heures " + minutes + " minutes";
}
/**
* Recupere le cout du sous-traitant pour la commande et le sous-traitants donne
*
* @return
*/
public Float getSousTraitantsTotalCost() {
return sousTraitantsManager.getSumOfCostForCommande(sousTraitantsEntity, commandesEntity);
}
/**
* Traite les minutes rentrees
*/
@OnEvent(value = "AfterSubmit", component = "ajoutHeure")
private void traiteHeure() {
Float res = 0.f;
Float quotient = (float) 1 / 60;
if (heuresSelected != null)
res += heuresSelected;
if (minutesSelected != null)
res += minutesSelected * quotient;
if (heuresSelected != null || minutesSelected != null) {
HistoriqueHeuresEntity historiqueHeuresEntity = new HistoriqueHeuresEntity();
historiqueHeuresEntity.setHistoriqueHeures(res);
historiqueHeuresEntity.setHistoriqueDate(new Date());
historiqueHeuresEntity.setIntervenantsByInterId(intervenantsEntity);
historiqueHeuresEntity.setCommandesByCommandId(commandesEntity);
listHeureToPersist.add(historiqueHeuresEntity);
}
}
/**
* Traite les sommes rentrees
*/
@OnEvent(value = "AfterSubmit", component = "ajoutSomme")
private void traiteSomme() {
if (sommeSelected != null) {
HistoriqueSommeEntity historiqueSommeEntity = new HistoriqueSommeEntity();
historiqueSommeEntity.setCommandesByCommandId(commandesEntity);
historiqueSommeEntity.setHistoriqueDate(new Date());
historiqueSommeEntity.setHistoriqueSomme(sommeSelected);
historiqueSommeEntity.setSousTraitantsByStId(sousTraitantsEntity);
listSommesToPersist.add(historiqueSommeEntity);
}
}
/**
* Toggle l'affichage de l'historique des heures
*
* @return la page de modification
*/
@OnEvent(value = "action", component = "HistoriqueHeuresShow")
private Object onHistoriqueHeuresShow(Integer commandId) {
isDisplayHeure = !isDisplayHeure;
if (commandId != null) {
return resources.createPageLink(ModificationCommandes.class, false, commandId);
}
return null;
}
/**
* Toggle l'affichage de l'historique des sommes
*
* @return la page de modification
*/
@OnEvent(value = "action", component = "HistoriqueSommesShow")
private Object onHistoriqueSomme(Integer commandId) {
isDisplaySommes = !isDisplaySommes;
if (commandId != null) {
return resources.createPageLink(ModificationCommandes.class, false, commandId);
}
return null;
}
/**
* Libelle pour le lien de toggle de l'historique
*
* @return Label pour le lien
*/
public String getLabelLienHeure() {
if (isDisplayHeure) {
return "Cacher l'historique des heures";
}
return "Afficher l'historique des heures";
}
/**
* libelle pour le lien de toggle de l'historique des sommes
*
* @return
*/
public String getLabelLienSomme() {
if (isDisplaySommes) {
return "Cacher l'historique des sous-traitants";
}
return "Afficher l'historique des sous-traitants";
}
/**
* Met la case vide dans le cas d'un devis a 0
*
* @return
*/
public Float getCommandDevis() {
if (commandesEntity != null && commandesEntity.getCommandDevis() != null && commandesEntity.getCommandDevis() > 0) {
return commandesEntity.getCommandDevis();
}
return null;
}
/**
* Applique les modifications du devis
*
* @param inDevis
*/
public void setCommandDevis(Float inDevis) {
commandesEntity.setCommandDevis(inDevis);
}
public String getTotalHours() {
return formatHeuresEtMinutes(commandesManager.getSumOfHoursByCommandes(commandesEntity));
}
/**
* Recherche de client par le formulaire
*/
@OnEvent(component = "rechercheCommandeForm", value = Form.SUCCESS)
private void onSuccessFromRechercheClientForm() {
toPassivate = true;
}
private Integer onPassivate() {
if (toPassivate) {
return inputSearch;
}
return null;
}
}