/*
 * Version 1.1
 * CeCILL Copyright (c) 2006-2007, AtolCD, ADULLACT-projet
 * Initiated by AtolCD S.A. & ADULLACT-projet S.A.
 * Developped by AtolCD
 * 
 * contact@atolcd.com
 * contact@adullact-projet.coop
 * 
 * Ce logiciel est un programme informatique servant à faire circuler des 
 * documents au travers d'un circuit de validation, où chaque acteur vise 
 * le dossier, jusqu'à l'étape finale de signature.
 * 
 * Ce logiciel est régi par la licence CeCILL soumise au droit français et
 * respectant les principes de diffusion des logiciels libres. Vous pouvez
 * utiliser, modifier et/ou redistribuer ce programme sous les conditions
 * de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA 
 * sur le site "http://www.cecill.info".
 * 
 * En contrepartie de l'accessibilité au code source et des droits de copie,
 * de modification et de redistribution accordés par cette licence, il n'est
 * offert aux utilisateurs qu'une garantie limitée.  Pour les mêmes raisons,
 * seule une responsabilité restreinte pèse sur l'auteur du programme,  le
 * titulaire des droits patrimoniaux et les concédants successifs.
 * 
 * A cet égard  l'attention de l'utilisateur est attirée sur les risques
 * associés au chargement,  à l'utilisation,  à la modification et/ou au
 * développement et à la reproduction du logiciel par l'utilisateur étant 
 * donné sa spécificité de logiciel libre, qui peut le rendre complexe à 
 * manipuler et qui le réserve donc à des développeurs et des professionnels
 * avertis possédant  des  connaissances  informatiques approfondies.  Les
 * utilisateurs sont donc invités à charger  et  tester  l'adéquation  du
 * logiciel à leurs besoins dans des conditions permettant d'assurer la
 * sécurité de leurs systèmes et ou de leurs données et, plus généralement, 
 * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. 
 * 
 * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez 
 * pris connaissance de la licence CeCILL, et que vous en avez accepté les
 * termes.
 *  
 */

package com.atolcd.parapheur.repo;

import java.util.Date;
import java.util.Set;

import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;

public interface EtapeCircuit
{
    public static final String ETAPE_VISA = "VISA";
    public static final String ETAPE_SIGNATURE = "SIGNATURE";
    public static final String ETAPE_TDT = "TDT";
    public static final String ETAPE_DIFF_EMAIL = "DIFF_EMAIL";
    public static final String ETAPE_ARCHIVAGE = "ARCHIVAGE";

    public static final String TRANSITION_PARAPHEUR = "PARAPHEUR";
    public static final String TRANSITION_CHEF_DE = "CHEF_DE";
    public static final String TRANSITION_EMETTEUR = "EMETTEUR";

    /**
     * Renvoie le parapheur associé à l'étape.
     * 
     * @return le NodeRef du parapheur associé à l'étape.
     */
    public abstract NodeRef getParapheur();
    
    /**
     * Indique si l'étape a été approuvée ou non.
     * 
     * @return <code>true</code> si l'étape a été approuvée.
     */
    public abstract boolean isApproved();

    /**
     * Renvoie le type de transition d'une étape vers une autre.
     * 
     * Cela permet de choisir comme prochaine étape :
     * <ul>
     *     <li>Un parapheur particulier (PARAPHEUR)</li>
     *     <li>Le supperieur hiérarchique de l'étape précédente (CHEF_DE)</li>
     *     <li>L'emetteur du dossier (EMETTEUR)</li>
     * </ul>
     * 
     * @return transition la transition selectionnée
     */
    public abstract String getTransition();

    /**
     * Renvoie le type d'action prévue à cette étape
     *
     * @return l'action demandée: VISA, SIGNATURE, TDT, DIFF_EMAIL, ARCHIVAGE
     */
    public abstract String getActionDemandee();

    /**
     * Renvoie le délégateur (noderef), en cas d'étape par délégation
     * 
     * @return le délégateur, null sinon.
     */
    public abstract NodeRef getDelegateur();

    /**
     * Renvoie le délégateur (string), en cas d'étape par délégation
     *
     * @return le délégateur, null sinon.
     */
    public abstract String getDelegateurName();

    /**
     * Retourne l'annotation publique déposée à cette étape du circuit.
     * 
     * @return l'annotation publique associée à l'étape.
     */
    public abstract String getAnnotation();
    
    /**
     * Retourne l'annotation privée déposée à cette étape du circuit.
     * 
     * @return l'annotation privée associée à l'étape.
     */
    public abstract String getAnnotationPrivee();
    
    /**
     * Retourne le signataire de l'étape.
     * 
     * @return le signataire associé à l'étape.
     */
    public abstract String getSignataire();
    
    /**
     * Retourn la date à laquelle l'étape a été validée
     * 
     * @return la date de validation de l'étape
     */
    public abstract Date getDateValidation();
    
    /**
     * Retourne une indication sur le certificat utilisé pour la signature,
     * ou <code>null</code> si aucun certificat n'a été utilisé.
     * 
     * @return une indication du certificat utilisé
     */
    public abstract String getSignature();

    /**
     * Retourne la signature électronique, ou <code>null</code> si absent.
     *
     * @return signature électronique si présente
     */
    public abstract String getSignatureEtape();

    /**
     * Retourne la liste de diffusion concernant cette étape,
     * ou <code>null</code> si aucun parapheur à notifier.
     * 
     * @return une liste de parapheurs?
     */
    public abstract Set<NodeRef> getListeNotification();

    /**
     * Renseigne la liste de diffusion de l'étape.
     *
     * @return
     */
    public abstract void setAndRecordListeDiffusion(NodeService nodeService, Set<NodeRef> liste);

    /**
     * Retourne une suite d'emails (séparés par virgule) de notification,
     * ou <code>null</code> si pas de notification externe.
     * 
     * @return une liste CSV d'adresses email
     */
    public abstract String getNotificationsExternes();
}
