fr.amapj.view.views.permanence.mespermanences.small.SmallInscriptionPermanence.java Source code

Java tutorial

Introduction

Here is the source code for fr.amapj.view.views.permanence.mespermanences.small.SmallInscriptionPermanence.java

Source

/*
 *  Copyright 2013-2018 Emmanuel BRUN (contact@amapj.fr)
 * 
 *  This file is part of AmapJ.
 *  
 *  AmapJ is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU Affero General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
    
 *  AmapJ is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Affero General Public License for more details.
 *
 *  You should have received a copy of the GNU Affero General Public License
 *  along with AmapJ.  If not, see <http://www.gnu.org/licenses/>.
 * 
 * 
 */
package fr.amapj.view.views.permanence.mespermanences.small;

import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.VerticalLayout;

import fr.amapj.model.models.permanence.periode.RegleInscriptionPeriodePermanence;
import fr.amapj.service.services.permanence.mespermanences.MesPermanencesService;
import fr.amapj.service.services.permanence.mespermanences.MesPermanencesService.InscriptionMessage;
import fr.amapj.service.services.permanence.mespermanences.UnePeriodePermanenceDTO;
import fr.amapj.service.services.permanence.periode.PeriodePermanenceDTO;
import fr.amapj.service.services.permanence.periode.PeriodePermanenceDateDTO;
import fr.amapj.service.services.permanence.periode.PeriodePermanenceService;
import fr.amapj.service.services.permanence.periode.PermanenceCellDTO;
import fr.amapj.view.engine.popup.PopupListener;
import fr.amapj.view.engine.popup.messagepopup.MessagePopup;
import fr.amapj.view.engine.popup.okcancelpopup.OKCancelPopup;
import fr.amapj.view.engine.tools.BaseUiTools;
import fr.amapj.view.views.common.gapviewer.DatePerDateViewer;
import fr.amapj.view.views.permanence.mespermanences.MesPermanencesUtils;
import fr.amapj.view.views.permanence.mespermanences.grille.InscriptionPopup;

/**
 * Popup permettant le choix des permanences par l'amapien 
 *  
 */
public class SmallInscriptionPermanence extends OKCancelPopup implements PopupListener {

    private Long userId;

    private PeriodePermanenceDTO dto;

    private UnePeriodePermanenceDTO periodePermanenceDTO;

    private VerticalLayout compteur;

    private VerticalLayout planning;

    private DatePerDateViewer<PeriodePermanenceDateDTO> dateViewer;

    // Permet de choisir entre le mode visualiser seul et le mode modifier
    private boolean visualiser;

    /**
     * 
     */
    public SmallInscriptionPermanence(Long idPeriodePermanence, Long userId, boolean visualiser) {
        this.userId = userId;
        this.visualiser = visualiser;
        this.dto = new PeriodePermanenceService().loadPeriodePermanenceDTO(idPeriodePermanence);

        if (visualiser) {
            popupTitle = "Visualisation des permanences";
        } else {
            popupTitle = "Choix des permanences";
        }
        hasSaveButton = false;
        cancelButtonTitle = "OK";

        computeSouhaiteeReelle();

    }

    private void computeSouhaiteeReelle() {
        periodePermanenceDTO = new MesPermanencesService().loadCompteurPeriodePermanence(dto.id, userId);
    }

    @Override
    protected void createContent(VerticalLayout contentLayout) {
        compteur = new VerticalLayout();
        compteur.addStyleName("popup-choix-permanence");
        contentLayout.addComponent(compteur);

        dateViewer = new DatePerDateViewer<PeriodePermanenceDateDTO>(dto.datePerms, e -> e.datePerm, this);
        contentLayout.addComponent(dateViewer.getComponent());

        VerticalLayout central = new VerticalLayout();
        contentLayout.addComponent(central);

        planning = new VerticalLayout();
        planning.addStyleName("popup-choix-permanence");
        central.addComponent(planning);

        onPopupClose();
    }

    @Override
    // Never used
    protected boolean performSauvegarder() {
        return true;
    }

    @Override
    public void onPopupClose() {
        //
        compteur.removeAllComponents();
        if (visualiser == false) {
            String cpt = MesPermanencesUtils.getLibCompteur(periodePermanenceDTO);
            BaseUiTools.addHtmlLabel(compteur, cpt, "compteur");
        }

        //
        planning.removeAllComponents();

        PeriodePermanenceDateDTO detail = dateViewer.getDate();

        String msg = getMessageListeInscrit(detail);
        BaseUiTools.addHtmlLabel(planning, msg, "liste-inscrits");

        // Indique si il est encore possible de s'inscire ou non pour cette date 
        boolean isModifiable = MesPermanencesUtils.isDateModifiable(periodePermanenceDTO, detail);

        if (visualiser) {
            doVisualiserPart(detail, isModifiable);
        } else {
            if (isModifiable) {
                doModifierPart(detail);
            } else {
                doVisualiserPart(detail, isModifiable);
            }
        }
    }

    private void doVisualiserPart(PeriodePermanenceDateDTO detail, boolean isModifiable) {
        boolean isInscrit = detail.isInscrit(userId);
        boolean placeDispo = isPlaceDispo(detail);

        if (isModifiable) {
            BaseUiTools.addHtmlLabel(planning, "Il est encore possible de modifier ses choix sur cette date",
                    "place-dispo");
        } else {
            BaseUiTools.addHtmlLabel(planning, "Il n'est plus possible de modifier ses choix sur cette date",
                    "place-dispo");
        }

        // Si l'utilisateur est dj inscrit pour cette date 
        if (isInscrit) {
            BaseUiTools.addHtmlLabel(planning, "Vous tes inscrit pour cette permanence.", "place-dispo");
            return;
        }

        // Si pas de place disponible
        if (placeDispo == false) {
            BaseUiTools.addHtmlLabel(planning, "Il n'y a plus de place disponible  cette date.", "place-dispo");
            return;
        }
    }

    private void doModifierPart(PeriodePermanenceDateDTO detail) {

        boolean isInscrit = detail.isInscrit(userId);
        boolean placeDispo = isPlaceDispo(detail);

        // Si l'utilisateur est dj inscrit pour cette date 
        if (isInscrit) {
            BaseUiTools.addHtmlLabel(planning, "Vous tes inscrit pour cette permanence.", "place-dispo");
            Button b = new Button("Je ne souhaite plus venir  cette date.");
            b.addStyleName("suppress-inscrire");
            b.addClickListener(e -> handleSuppressionInscription(detail));

            planning.addComponent(b);
            planning.setComponentAlignment(b, Alignment.MIDDLE_CENTER);

            return;
        }

        // Si pas de place disponible
        if (placeDispo == false) {
            BaseUiTools.addHtmlLabel(planning, "Il n'y a plus de place disponible  cette date.", "place-dispo");
            return;
        }

        // Cas standard : on peut s'inscrire 
        Button b = new Button("Je m'inscris  cette date");
        b.addStyleName("inscrire");
        b.addClickListener(e -> handleInscription(detail));

        planning.addComponent(b);
        planning.setComponentAlignment(b, Alignment.MIDDLE_CENTER);

    }

    private boolean isPlaceDispo(PeriodePermanenceDateDTO detail) {
        int nbPlace = detail.nbPlace - detail.getNbInscrit();
        if (nbPlace <= 0) {
            return false;
        }
        return true;
    }

    private String getMessageListeInscrit(PeriodePermanenceDateDTO detail) {
        String msg = "";

        if (detail.nbPlace == 0) {
            msg = msg + "Pas de permanence ce jour l.";
            return msg;
        } else if (detail.nbPlace == 1) {
            msg = msg + "1 personne est ncessaire pour cette permanence.";
        } else {
            msg = msg + detail.nbPlace + " personnes sont ncessaires pour cette permanence.";
        }

        msg = msg + "<br/>";

        if (detail.getNbInscrit() == 0) {
            msg = msg + "Personne n'est encore inscrit.";
        } else if (detail.getNbInscrit() == 1) {
            msg = msg + "Une personne est inscrite :";
        } else {
            msg = msg + detail.getNbInscrit() + " personnes sont inscrites.";
        }

        msg = msg + "<ul>";
        for (PermanenceCellDTO pc : detail.permanenceCellDTOs) {
            msg = msg + "<li>" + "Role " + pc.nomRole + " - " + pc.nom + " " + pc.prenom + "</li>";
        }
        msg = msg + "</ul>";

        return msg;
    }

    /**
     * 
     */
    private void handleInscription(PeriodePermanenceDateDTO detail) {
        //
        if (periodePermanenceDTO.nbInscription >= periodePermanenceDTO.nbSouhaite) {
            MessagePopup popup = new MessagePopup("Impossible de s'inscrire", ColorStyle.GREEN,
                    "Vous tes dj inscrit sur suffisamment de dates.");
            MessagePopup.open(popup);
            return;
        }

        //
        InscriptionMessage msg = new MesPermanencesService().inscription(userId, detail.idPeriodePermanenceDate,
                null, RegleInscriptionPeriodePermanence.UNE_INSCRIPTION_PAR_DATE); // TODO gerer le role 
        if (msg != null) {
            String lib = InscriptionPopup.computeLib(msg);
            MessagePopup popup = new MessagePopup("Impossible de s'inscrire", ColorStyle.RED,
                    "Vous ne pouvez pas vous inscrire car " + lib);
            MessagePopup.open(popup, () -> handleFinInscription());
        } else {
            handleFinInscription();
        }
    }

    private void handleFinInscription() {
        // On recharge d'abord la liste des infos 
        this.dto = new PeriodePermanenceService().loadPeriodePermanenceDTO(dto.id);
        dateViewer.updateDates(dto.datePerms);

        // On recharge aussi les compteurs
        computeSouhaiteeReelle();

        // On raffiche l'cran 
        onPopupClose();

    }

    private void handleSuppressionInscription(PeriodePermanenceDateDTO detail) {
        //
        new MesPermanencesService().deleteInscription(userId, detail.idPeriodePermanenceDate);
        handleFinInscription();
    }

}