fr.amapj.view.views.saisiecontrat.PopupSaisieQteContratPanier.java Source code

Java tutorial

Introduction

Here is the source code for fr.amapj.view.views.saisiecontrat.PopupSaisieQteContratPanier.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.saisiecontrat;

import java.text.SimpleDateFormat;
import java.util.List;

import com.vaadin.shared.ui.label.ContentMode;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;

import fr.amapj.service.services.mescontrats.ContratColDTO;
import fr.amapj.service.services.mescontrats.ContratDTO;
import fr.amapj.view.engine.grid.GridHeaderLine;
import fr.amapj.view.engine.grid.GridSizeCalculator;
import fr.amapj.view.engine.grid.integergrid.PopupIntegerGrid;
import fr.amapj.view.engine.popup.PopupListener;
import fr.amapj.view.engine.popup.messagepopup.MessagePopup;
import fr.amapj.view.engine.tools.BaseUiTools;
import fr.amapj.view.engine.widgets.CurrencyTextFieldConverter;
import fr.amapj.view.views.saisiecontrat.ContratAboManager.ContratAbo;
import fr.amapj.view.views.saisiecontrat.SaisieContrat.ModeSaisie;
import fr.amapj.view.views.saisiecontrat.SaisieContrat.SaisieContratData;

/**
 * Popup pour la saisie des quantites pour un contrat
 * de type "Panier", c'est  dire sans le choix des dates 
 *  
 */
public class PopupSaisieQteContratPanier extends PopupIntegerGrid implements PopupListener {
    SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");

    private ContratDTO contratDTO;

    private SaisieContratData data;

    // Largeur de la colonne description des produits 
    private int largeurColonne = 500; //TODO faire varier en fonction de la taille de l'cran

    // Informations condense du contrat
    private ContratAbo abo;

    /**
     * 
     */
    public PopupSaisieQteContratPanier(SaisieContratData data) {
        super();

        this.data = data;
        this.contratDTO = data.contratDTO;
        this.abo = new ContratAboManager().computeContratAbo(contratDTO);

        //
        popupTitle = "Mon contrat " + contratDTO.nom;

        // 
        param.readOnly = (data.modeSaisie == ModeSaisie.READ_ONLY);
        param.messageSpecifique = data.messageSpecifique;

    }

    public void loadParam() {
        // Partie jokers
        if (contratDTO.jokerNbMax > 0) {
            param.messageSpecifiqueBottom = computeJokerMessage();
        }

        //
        param.nbLig = contratDTO.contratColumns.size();
        param.nbCol = 1;
        param.qte = computeQte();
        param.excluded = computeExcluded();
        param.buttonCopyFirstLine = false;

        // tableau des prix
        param.prix = new int[param.nbLig][param.nbCol];
        fillTableauPrix();
        param.libPrixTotal = "Prix Total";

        // Largeur des colonnes
        param.largeurCol = 110;

        // Construction du header 1
        GridHeaderLine line1 = new GridHeaderLine();
        line1.styleName = "tete";
        line1.cells.add("Produit");
        line1.cells.add("Qte");

        param.headerLines.add(line1);

        // Partie gauche de chaque ligne
        param.leftPartLineLargeur = largeurColonne;
        param.leftPartLineStyle = "description-panier";
        for (ContratColDTO col : contratDTO.contratColumns) {
            param.leftPartLine.add(getText(col));
        }

    }

    private void fillTableauPrix() {
        for (int i = 0; i < param.nbLig; i++) {
            ContratColDTO col = contratDTO.contratColumns.get(i);
            int nbLivraison = getNbLivraison(i);
            param.prix[i][0] = col.prix * nbLivraison;
        }
    }

    private int[][] computeQte() {
        int[][] res = new int[contratDTO.contratColumns.size()][1];

        for (int j = 0; j < contratDTO.contratColumns.size(); j++) {
            res[j][0] = abo.qte[j];
        }

        return res;
    }

    private boolean[][] computeExcluded() {
        boolean[][] res = new boolean[contratDTO.contratColumns.size()][1];

        for (int j = 0; j < contratDTO.contratColumns.size(); j++) {
            int nbLivraison = getNbLivraison(j);
            res[j][0] = (nbLivraison == 0);
        }

        return res;
    }

    private String getText(ContratColDTO col) {
        String str = getLine1(col) + "<br/>";

        str = str + "Prix unitaire : " + new CurrencyTextFieldConverter().convertToString(col.prix) + " <br/>";

        int nbLivraison = getNbLivraison(col.j);

        if (nbLivraison == 0) {
            str = str + "Produit non disponible";
        } else {
            str = str + "<b>" + nbLivraison + " livraisons , prix total de "
                    + new CurrencyTextFieldConverter().convertToString(nbLivraison * col.prix) + " </b>";
        }

        return str;
    }

    private String getLine1(ContratColDTO col) {
        return "Abonnement pour 1 " + col.nomProduit + "," + col.condtionnementProduit;
    }

    /**
     * On calcule le nombre de livraison pour ce produit 
     * en tenant compte des dates exclues et des dates jokers
     * 
     * @param indexProduit
     * @return
     */
    private int getNbLivraison(int indexProduit) {
        int nbLivraison = 0;
        for (int i = 0; i < contratDTO.contratLigs.size(); i++) {
            if (contratDTO.isExcluded(i, indexProduit) == false && abo.isJoker(i) == false) {
                nbLivraison++;
            }
        }

        return nbLivraison;
    }

    @Override
    protected void handleContinuer() {
        data.validate();
        close();
    }

    @Override
    public boolean performSauvegarder() {
        // Extraction des quantits
        int[][] qte = extractQte();

        // On vrifie si on atteint le nombre minimum de jokers
        String msg = new ContratAboManager().checkJokerMin(contratDTO, qte);
        if (msg != null) {
            MessagePopup.open(new MessagePopup("Impossible de continuer", ContentMode.HTML, ColorStyle.RED, msg));
            return false;
        }

        // On copie dans le contratDto
        contratDTO.qte = qte;

        //
        data.validate();
        return true;
    }

    /**
     * Une ligne de la table contient dans le cas standard 3 lignes de texte
     * Exemple : 
     *     Abonnement pour 1 Pain de bl
     *     Prix unitaire : 7.00 
     *     4 livraisons , prix total de 28.00 
     * 
     *  Une ligne de texte fait 16 de hauteur, et il y a 10 de marges en haut et bas
     *  Le mode readOnly n'a pas d'impact 
     *  
     *  Par contre, la premire ligne ("Abonnement pour 1 Pain de bl" dans l'exemple) peut faire 
     *  plus de 50 pixels, il faut donc compter le nombre de ligne max que peut prendre cette 
     *  premiere ligne
     *  
     */
    @Override
    public int getLineHeight(boolean readOnly) {
        int nbLineMax = getNbLineMax();
        return (nbLineMax + 1 + 1) * 16 + 10 + 10;
    }

    /**
     * Retourne le nombre de ligne max sur toutes les cellules pour la ligne 1 
     */
    private int getNbLineMax() {
        int nbLine = 1;
        GridSizeCalculator cal = new GridSizeCalculator();

        for (ContratColDTO col : contratDTO.contratColumns) {
            String cell = getLine1(col);
            nbLine = Math.max(nbLine, cal.getHeight(cell, largeurColonne - 22, "Arial", 16));
        }
        return nbLine;
    }

    @Override
    public int getHeaderHeight() {
        // On cacule la place consomme par les headers, boutons, ...
        // 284 : nombre de pixel mesure pour les haeders, les boutons, ... en mode normal, 185 en mode compact
        return BaseUiTools.isCompactMode() ? 185 : 284;
    }

    protected void createButtonBar() {
        Button detailDate = addButton("Dtail des dates de livraison", e -> handleDetailDate());
        setButtonAlignement(detailDate, Alignment.TOP_LEFT);

        if (contratDTO.jokerNbMax > 0) {
            String caption = data.modeSaisie == ModeSaisie.READ_ONLY ? "Voir mes jokers" : "Choisir mes jokers";
            Button jokerBtn = addButton(caption, e -> handleJoker());
            setButtonAlignement(jokerBtn, Alignment.TOP_LEFT);
        }

        super.createButtonBar();
    }

    private void handleDetailDate() {
        // On copie dans un tableau temporaire les quantits saisies       
        int[][] qte = extractQte();

        // On affiche 
        PopupDetailDate.open(new PopupDetailDate(contratDTO, qte));
    }

    private void handleJoker() {
        PopupSaisieJoker.open(new PopupSaisieJoker(abo, contratDTO, data.modeSaisie == ModeSaisie.READ_ONLY), this);
    }

    /**
     * Extraction des quantits et remise en forme classique 
     */
    private int[][] extractQte() {
        // On lit dans la grille de saisie
        for (int j = 0; j < contratDTO.contratColumns.size(); j++) {
            // On lit la quantit saisie
            int qteSaisie = param.qte[j][0];

            //
            abo.qte[j] = qteSaisie;
        }

        return new ContratAboManager().extractQte(abo, contratDTO);

    }

    /**
     * Permet le rafraichissement de l'ecran quand on revient des jokers 
     */
    @Override
    public void onPopupClose() {
        // On rafraichit tout d'abord le texte des jokers
        updateLabelMessageSpecifiqueBottom(computeJokerMessage());

        // On rafaichit ensuite les libells 
        List<ContratColDTO> contratColumns = contratDTO.contratColumns;
        for (int i = 0; i < contratColumns.size(); i++) {
            ContratColDTO col = contratColumns.get(i);
            updateFirstCol(i, getText(col));
        }

        // Il faut ensuite mettre  jour la matrice de prix
        fillTableauPrix();
        updatePrixTotal();

    }

    private String computeJokerMessage() {
        return new ContratAboManager().computeJokerMessage(contratDTO, abo.dateJokers.size());
    }

}