QUELQUES ARTICLES ASSOCIES

Alfresco – Développement spécifique – JSP – Custom Dialogue – Java

Vous trouvez que la recherche avancée d’Alfresco (advanced search) n’est pas suffisante, voici un exemple de développement pour enrichir le produit et prendre en compte vos propres propriétés :

Nous avons besoin d’un affichage personnalisé pour afficher les résultats de recherche. Je n’ai pas trouvé la façon d’appliquer les résultats de recherche de modèle à l’aide du client Web, alors j’ai mis en place une boite de dialogue spécifique qui prend des termes de recherche en tant que paramètres et affiche les résultats en utilisant des JSP personnalisées.

Voici les détails de la mise en œuvre :

1 – Création de mon projet dans Eclipse :

2 – Création de ma classe Java principale OpsFullSearchDialog qui étend la classe « BaseDialogBean » :


Code:
package fr.openspir.ged.alfresco;import java.text.SimpleDateFormat;
import java.util.Date;import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

import org.alfresco.service.cmr.repository.Path;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.search.ResultSetRow;
import org.alfresco.service.cmr.search.SearchParameters;
import org.alfresco.web.bean.dialog.BaseDialogBean;

/**
*
* <pre>
* <b>OpsFullSearchDialog</b>.
*
* <b>Description :</b>
* Recherche complète.
*
* </pre>
* @author OPENSPIR<BR>
* <BR>
* Créé le 22 mars 10 <BR>
* <BR>
* <BR>
* <i>Copyright : OpenSpir 2010 </i><BR>
*/
public class OpsFullSearchDialog extends BaseDialogBean {
/**
*
*/
private static final long serialVersionUID = 8405116002762390937L;

private static final String TYPE_CHAMPS_BOOLEAN = « boolean »;

private static final String TYPE_CHAMPS_STRING = « string »;

private static final String TYPE_CHAMPS_INTERVALLE_DATE = « intervalleDate »;

/**
* Champs de recherche
*/
private String searchTypologie;

private String searchNature;

private String searchNomClient;

private String searchNomFrs;

private String searchMontant;

private String searchRegle;

private Date searchDateRapproDeb;

private Date searchDateRapproFin;

/**
* Test que la recherche soit terminée
*/
private boolean searchFinished;

/**
* Les noeuds trouvés
*/
private java.util.List<Node> sortedNodes;

/*
* (non-Javadoc)
* @see org.alfresco.web.bean.dialog.BaseDialogBean#init(java.util.Map)
*/
public void init(java.util.Map parameters) {
super.init(parameters);
searchFinished = false;
}

/*
* (non-Javadoc)
* @see org.alfresco.web.bean.dialog.BaseDialogBean#finishImpl(javax.faces.context.FacesContext, java.lang.String)
*/
protected String finishImpl(FacesContext context, String outcome)
throws Exception {
startSearch();
searchFinished = true;
return « do nothing »;
}

/*
* (non-Javadoc)
* @see org.alfresco.web.bean.dialog.BaseDialogBean#getFinishButtonDisabled()
*/
public boolean getFinishButtonDisabled() {
return searchFinished;
}

/*
*
*/
public boolean getNewSearchDisabled() {
return !searchFinished;
}

/*
* (non-Javadoc)
* @see org.alfresco.web.bean.dialog.BaseDialogBean#getFinishButtonLabel()
*/
public String getFinishButtonLabel() {
return « Search »;
}

/*
* (non-Javadoc)
* @see org.alfresco.web.bean.dialog.BaseDialogBean#getCancelButtonLabel()
*/
public String getCancelButtonLabel() {
return « Finish »;
}

/**
* Méthode principale : Lancement de la recherche et enregistrement des résultats dans « sortedNodes »
*/
public void startSearch() {

sortedNodes = new java.util.ArrayList<Node>();

SearchParameters searchParameters = new SearchParameters();
searchParameters.addStore(new StoreRef(« workspace », « SpacesStore »));
searchParameters.setLanguage(this.getSearchService().LANGUAGE_LUCENE);

// Initialisation du tableau des aspects
String[] lstAspects = new String[] { « OpenSpirCliFac », « OpenSpirCliBC »,
« OpenSpirCliDevis », « OpenSpirCliEchange », « OpenSpirFrsFac »,
« OpenSpirFrsBC », « OpenSpirFrsDevis », « OpenSpirFrsEchange »,
« OpenSpirAssAttestation », « OpenSpirAssEchange »,
« OpenSpirAssPaiement », « OpenSpirBanqueFacture »,
« OpenSpirBanqueEchange », « OpenSpirBanqueReleve »,
« OpenSpirURSSAFCotisation », « OpenSpirURSSAFEchange »,
« OpenSpirNFRRecap », « OpenSpirNFRJustificatif » };

String myQuery = « PATH:\ »/app:company_home/cm:OpenSpir//.\ » « ;

myQuery = myQuery
+ generateQuery(myQuery, lstAspects,
new String[] { « Typologie » }, TYPE_CHAMPS_STRING,
searchTypologie, null);
myQuery = myQuery
+ generateQuery(myQuery, lstAspects, new String[] { « Nature » },
TYPE_CHAMPS_STRING, searchNature, null);
myQuery = myQuery
+ generateQuery(myQuery, lstAspects, new String[] { « Client » },
TYPE_CHAMPS_STRING, searchNomClient, null);
myQuery = myQuery
+ generateQuery(myQuery, lstAspects,
new String[] { « Fournisseur » }, TYPE_CHAMPS_STRING,
searchNomFrs, null);
myQuery = myQuery
+ generateQuery(myQuery, lstAspects, new String[] {
« MontantHT », « MontantTTC » }, TYPE_CHAMPS_STRING,
searchMontant, null);
myQuery = myQuery
+ generateQuery(myQuery, lstAspects,
new String[] { « Rapproche » },
TYPE_CHAMPS_INTERVALLE_DATE, searchDateRapproDeb,
searchDateRapproFin);
myQuery = myQuery
+ generateQuery(myQuery, lstAspects, new String[] { « Regle » },
TYPE_CHAMPS_BOOLEAN, searchRegle, null);

System.out.println();
System.out.println(« OPS requete =  » + myQuery);
System.out.println();

// Affectation de la requête
searchParameters.setQuery(myQuery);

ResultSet reports = this.getSearchService().query(searchParameters);
for (ResultSetRow row : reports) {
Path path = getNodeService().getPath(row.getNodeRef());

sortedNodes.add(new Node(row, path));
}
}

/**
* Génération de la requête.
*
* @param query – La recherche initiale
* @param lstAspects – La liste des aspects
* @param nomChamps – Le nom du champ
* @param typeChamps – Le type de champs
* @param valeurChamps – La valeur du champ
* @param valeurChamps – La valeur du champ (pour les intervalles)
*/
private String generateQuery(String query, String[] lstAspects,
String[] nomChamps, String typeChamps, Object valeurChamps1,
Object valeurChamps2) {
String subquery = «  »;

// pour les String ou boolean
if (typeChamps != TYPE_CHAMPS_INTERVALLE_DATE) {
String valeurChamps = (String) valeurChamps1;

if (!valeurChamps.trim().equals(«  ») && lstAspects.length > 0) {
if (query.equals(«  »)) {
subquery =  » ( « ;
} else {
subquery =  » AND ( « ;
}

boolean firstPassage = true;
for (int cpt = 0; cpt < lstAspects.length; cpt++) {
for (int cptColonne = 0; cptColonne < nomChamps.length; cptColonne++) {
if (firstPassage) {
firstPassage = false;
} else {
subquery = subquery +  » OR « ;
}

// Test du type de champs
if (typeChamps.equals(TYPE_CHAMPS_BOOLEAN)) {
String valeur = « false »;
if (valeurChamps.trim().equals(« TRUE »)) {
valeur = « true »;
}
subquery = subquery + « @ » + lstAspects[cpt] + « \\: »
+ nomChamps[cptColonne] + « :\ »" + valeur
+ « \ »";
} else {
subquery = subquery + « @ » + lstAspects[cpt] + « \\: »
+ nomChamps[cptColonne] + « :\ »"
+ valeurChamps.trim() + « \ »";
}
}
}
subquery = subquery +  » ) »;
}
} else if (typeChamps.equals(TYPE_CHAMPS_INTERVALLE_DATE)) {
if (valeurChamps1 != null && valeurChamps2 != null
&& lstAspects.length > 0) {
// Analyse des dates
SimpleDateFormat simpleFormatAnnee = new SimpleDateFormat(
« yyyy »);
SimpleDateFormat simpleFormatMois = new SimpleDateFormat(« MM »);
SimpleDateFormat simpleFormatJour = new SimpleDateFormat(« dd »);

String anneeDebut = simpleFormatAnnee
.format((Date) valeurChamps1);
String moisDebut = simpleFormatMois
.format((Date) valeurChamps1);
String jourDebut = simpleFormatJour
.format((Date) valeurChamps1);

String anneeFin = simpleFormatAnnee
.format((Date) valeurChamps2);
String moisFin = simpleFormatMois.format((Date) valeurChamps2);
String jourFin = simpleFormatJour.format((Date) valeurChamps2);

String dateDebut = anneeDebut + « \\- » + moisDebut + « \\- »
+ jourDebut + « T00:00:00″;
String dateFin = anneeFin + « \\- » + moisFin + « \\- » + jourFin
+ « T23:59:59″;

if (query.equals(«  »)) {
subquery =  » ( « ;
} else {
subquery =  » AND ( « ;
}

boolean firstPassage = true;
for (int cpt = 0; cpt < lstAspects.length; cpt++) {
for (int cptColonne = 0; cptColonne < nomChamps.length; cptColonne++) {
if (firstPassage) {
firstPassage = false;
} else {
subquery = subquery +  » OR « ;
}

subquery = subquery + « @ » + lstAspects[cpt] + « \\: »
+ nomChamps + « :[" + dateDebut + " TO "
+ dateFin + "]« ;
}
}
subquery = subquery +  » ) »;
}
}

// System.out.println(« OPS requete tmp =  » + subquery);

return subquery;
}

/**
* Méthode appellée lors du clic sur « New Search »
* Réinitialidsation de la boite de dialogue
*/
public void newSearch() {
init(new java.util.HashMap());
}

/**
* Listes déroulantes
*/
public SelectItem[] getAllRegles() {
SelectItem[] items = new SelectItem[3];

items[0] = new SelectItem(«  », «  »);
items[1] = new SelectItem(« TRUE », « Réglé »);
items[2] = new SelectItem(« FALSE », « Non réglé »);

return items;
}

public SelectItem[] getAllTypologies() {
SelectItem[] items = new SelectItem[8];

items[0] = new SelectItem(«  », «  »);
items[1] = new SelectItem(« ASSURANCE », « Assurance »);
items[2] = new SelectItem(« BANQUE », « Banque »);
items[3] = new SelectItem(« CLIENT », « Clients »);
items[4] = new SelectItem(« FOURNISSEUR », « Fournisseurs »);
items[5] = new SelectItem(« IMPOT », « Impôt »);
items[6] = new SelectItem(« NFR », « Note de frais »);
items[7] = new SelectItem(« URSSAF », « Urssaf »);

return items;
}

public SelectItem[] getAllNatures() {
SelectItem[] items = new SelectItem[12];

items[0] = new SelectItem(«  », «  »);
items[1] = new SelectItem(« ATTESTATION », « Attestation »);
items[2] = new SelectItem(« BC », « Bon de commande »);
items[3] = new SelectItem(« COTISATION », « Cotisation »);
items[4] = new SelectItem(« DEVIS », « Devis »);
items[5] = new SelectItem(« DOCUMENT », « Document »);
items[6] = new SelectItem(« ECHANGE », « Echange »);
items[7] = new SelectItem(« FACTURE », « Facture »);
items[8] = new SelectItem(« JUSTIFICATIF », « Justificatif »);
items[9] = new SelectItem(« PAIEMENT », « Paiement »);
items[10] = new SelectItem(« RECAP », « Recapitulatif »);
items[11] = new SelectItem(« RELEVE », « Relevé de Compte »);

return items;
}

/**
* @return the searchFinished
*/
public boolean isSearchFinished() {
return searchFinished;
}

/**
* @param searchFinished the searchFinished to set
*/
public void setSearchFinished(boolean searchFinished) {
this.searchFinished = searchFinished;
}

/**
* @return the sortedNodes
*/
public java.util.List<Node> getSortedNodes() {
return sortedNodes;
}

/**
* @param sortedNodes the sortedNodes to set
*/
public void setSortedNodes(java.util.List<Node> sortedNodes) {
this.sortedNodes = sortedNodes;
}

/**
* @return the searchNature
*/
public String getSearchNature() {
return searchNature;
}

/**
* @param searchNature the searchNature to set
*/
public void setSearchNature(String searchNature) {
this.searchNature = searchNature;
}

/**
* @return the searchMontant
*/
public String getSearchMontant() {
return searchMontant;
}

/**
* @param searchMontant the searchMontant to set
*/
public void setSearchMontant(String searchMontant) {
this.searchMontant = searchMontant;
}

/**
* @return the searchNomClient
*/
public String getSearchNomClient() {
return searchNomClient;
}

/**
* @param searchNomClient the searchNomClient to set
*/
public void setSearchNomClient(String searchNomClient) {
this.searchNomClient = searchNomClient;
}

/**
* @return the searchNomFrs
*/
public String getSearchNomFrs() {
return searchNomFrs;
}

/**
* @param searchNomFrs the searchNomFrs to set
*/
public void setSearchNomFrs(String searchNomFrs) {
this.searchNomFrs = searchNomFrs;
}

/**
* @return the searchRegle
*/
public String getSearchRegle() {
return searchRegle;
}

/**
* @param searchRegle the searchRegle to set
*/
public void setSearchRegle(String searchRegle) {
this.searchRegle = searchRegle;
}

/**
* @return the searchTypologie
*/
public String getSearchTypologie() {
return searchTypologie;
}

/**
* @param searchTypologie the searchTypologie to set
*/
public void setSearchTypologie(String searchTypologie) {
this.searchTypologie = searchTypologie;
}

/**
* @return the searchDateRapproDeb
*/
public Date getSearchDateRapproDeb() {
return searchDateRapproDeb;
}

/**
* @param searchDateRapproDeb the searchDateRapproDeb to set
*/
public void setSearchDateRapproDeb(Date searchDateRapproDeb) {
this.searchDateRapproDeb = searchDateRapproDeb;
}

/**
* @return the searchDateRapproFin
*/
public Date getSearchDateRapproFin() {
return searchDateRapproFin;
}

/**
* @param searchDateRapproFin the searchDateRapproFin to set
*/
public void setSearchDateRapproFin(Date searchDateRapproFin) {
this.searchDateRapproFin = searchDateRapproFin;
}

}

 

3 – Création du fichier « faces-config.xml » afin de déclarer le Bean :


Code:

<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
"http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>
<managed-bean>
<managed-bean-name>OpsFullSearchDialog</managed-bean-name>
<managed-bean-class>fr.openspir.ged.alfresco.OpsFullSearchDialog</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>searchService</property-name>
<value>#{SearchService}</value>
</managed-property>
</managed-bean></faces-config>

4 – Création de ma page JSP :

 

Code:
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="/WEB-INF/alfresco.tld" prefix="a" %>
<%@ taglib uri="/WEB-INF/repo.tld" prefix="r" %>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<%– load a bundle of properties with I18N strings –%>
<r:loadBundle var= »msg »/><h:panelGroup rendered= »#{DialogManager.bean.searchFinished == false } »>
<f:verbatim>
<table cellpadding= »2″ cellspacing= »2″ border= »0″>
<tr>
<td style= »padding-left:8px »>
</f:verbatim>
<h:outputText value= »Typologie »/>
<f:verbatim>
</td>
<td>
</f:verbatim>
<h:selectOneMenu value= »#{DialogManager.bean.searchTypologie} » id= »selectTypo »>
<f:selectItems value= »#{DialogManager.bean.allTypologies} » id= »maTypo » />
</h:selectOneMenu>
<f:verbatim>
</td>
</tr>
<tr>
<td>
</f:verbatim>
<h:outputText value= »Nature »/>
<f:verbatim>
</td>
<td>
</f:verbatim>
<h:selectOneMenu value= »#{DialogManager.bean.searchNature} » id= »selectNature »>
<f:selectItems value= »#{DialogManager.bean.allNatures} » id= »maNature » />
</h:selectOneMenu>
<f:verbatim>
</td>
</tr>
<tr>
<td>
</f:verbatim>
<h:outputText value= »Client »/>
<f:verbatim>
</td>
<td>
</f:verbatim>
<h:inputText size= »100″ value= »#{DialogManager.bean.searchNomClient} » />
<f:verbatim>
</td>
</tr>
<tr>
<td>
</f:verbatim>
<h:outputText value= »Fournisseur »/>
<f:verbatim>
</td>
<td>
</f:verbatim>
<h:inputText size= »100″ value= »#{DialogManager.bean.searchNomFrs} » />
<f:verbatim>
</td>
</tr>
<tr>
<td>
</f:verbatim>
<h:outputText value= »Montant »/>
<f:verbatim>
</td>
<td>
</f:verbatim>
<h:inputText size= »20″ value= »#{DialogManager.bean.searchMontant} » />
<f:verbatim>
</td>
</tr>
<tr>
<td>
</f:verbatim>
<h:outputText value= »Regle »/>
<f:verbatim>
</td>
<td>
</f:verbatim>
<h:selectOneMenu value= »#{DialogManager.bean.searchRegle} » id= »selectRegle »>
<f:selectItems value= »#{DialogManager.bean.allRegles} » id= »choixRegle » />
</h:selectOneMenu>
<f:verbatim>
</td>
</tr>
<tr>
<td>
</f:verbatim>
<h:outputText value= »Rapprochement »/>
<f:verbatim>
</td>
<td>
<table>
<tr>
<td>
du
</td>
<td>
</f:verbatim>
<a:inputDatePicker value= »#{DialogManager.bean.searchDateRapproDeb} » yearCount= »#{DatePickerGenerator.yearCount} » startYear= »#{DatePickerGenerator.startYear} » id= »searchDateRapproDeb » initialiseIfNull= »false » />
<f:verbatim>
</td>
</tr>
<tr>
<td>
au
</td>
<td>
</f:verbatim>
<a:inputDatePicker value= »#{DialogManager.bean.searchDateRapproFin} » yearCount= »#{DatePickerGenerator.yearCount} » startYear= »#{DatePickerGenerator.startYear} » id= »searchDateRapproFin » initialiseIfNull= »false » />
<f:verbatim>
</td>
</tr>
</table>
</td>
</tr>
</table>
</f:verbatim>
</h:panelGroup>

<h:panelGroup rendered= »#{DialogManager.bean.searchFinished == true } »>
<a:richList viewMode= »details » pageSize= »10″ styleClass= »datatable » style= »border:thin »
rowStyleClass= »recordSetRow » altRowStyleClass= »recordSetRowAlt » width= »100% »
value= »#{DialogManager.bean.sortedNodes} » var= »r » initialSortColumn= »name » initialSortDescending= »true »>

<%– Primary column for details view mode –%>
<a:column id= »col1″ primary= »true » style= »padding:2px;text-align:left »>
<f:facet name= »header »>
<a:sortLink id= »col1-sort » label= »#{msg.name} » value= »name » mode= »case-insensitive » styleClass= »header »/>
</f:facet>
<h:outputLink value= »/alfresco/#{r.downloadUrl} » target= »_blank »>
<h:graphicImage url= »/images/filetypes/#{r.icone} » width= »16″ height= »16″ style= »padding-right:4px; border-width:0px;vertical-align:-4px; »/>
</h:outputLink>
<h:outputLink value= »/alfresco/#{r.downloadUrl} » target= »_blank »>
<h:outputText id= »col1-txt » value= »#{r.name} » />
</h:outputLink>
<r:nodeInfo id= »col1-info » value= »#{r.id} »>
<h:graphicImage id= »col1-img » url= »/images/icons/popup.gif » styleClass= »popupImage » width= »16″ height= »16″ />
</r:nodeInfo>
</a:column>

<%– Path column for search mode in details view mode –%>
<a:column id= »col5″ style= »text-align:left »>
<f:facet name= »header »>
<a:sortLink id= »col2-sort » label= »#{msg.path} » value= »displayPath » mode= »case-insensitive » styleClass= »header »/>
</f:facet>
<r:nodePath id= »col2-path » value= »#{r.path} » actionListener= »#{BrowseBean.clickSpacePath} » />
</a:column>

<%– Created Date column for details view mode –%>
<a:column id= »col6″ style= »text-align:left »>
<f:facet name= »header »>
<a:sortLink id= »col6-sort » label= »#{msg.created} » value= »created » styleClass= »header »/>
</f:facet>
<h:outputText id= »col6-txt » value= »#{r.created} »>
<a:convertXMLDate type= »both » pattern= »#{msg.date_time_pattern} » />
</h:outputText>
</a:column>

<%– Modified Date column for details/icons view modes –%>
<a:column id= »col7″ style= »text-align:left »>
<f:facet name= »header »>
<a:sortLink id= »col7-sort » label= »#{msg.modified} » value= »modified » styleClass= »header »/>
</f:facet>
<h:outputText id= »col7-txt » value= »#{r.modified} »>
<a:convertXMLDate type= »both » pattern= »#{msg.date_time_pattern} » />
</h:outputText>
</a:column>

<a:column id= »colActions » style= »text-align:left »>
<f:facet name= »header »>
<a:sortLink id= »colActions-sort » label= »Action » value= »" styleClass= »header »/>
</f:facet>
<r:actions id= »col18-acts1″ value= »ops_search » context= »#{r} » showLink= »false » styleClass= »inlineAction » />
</a:column>
<a:dataPager id= »pager1″ styleClass= »pager » />
</a:richList>
</h:panelGroup>

 

5 – Ajout de mes actions dans le fichier « web-client-config-actions.xml » :

 

Code:

<!-- OpenSpir -->
<action-group id="ops_search">
<show-link>false</show-link>
<style-class>inlineAction</style-class>
<action idref="download_doc" />
<action idref="details_doc" />
</action-group>

 

6 – Création de l’action dans le fichier « web-client-config-custom.xml » :

 

Code:
<alfresco-config><!– Add custom dialog –>
<config>
<actions>
<!– Lancement de la boite de dialogue Full OPS –>
<action id= »ops_full_search »>
<label>OPS recherche complete</label>
<image>/images/icons/view_web_project.gif</image>
<action>dialog:opsFullSearch</action>
</action>
<action-group id= »navigator_actions »>
<action idref= »ops_full_search »/>
</action-group>
</actions>
</config><config>
<dialogs>
<dialog name= »opsFullSearch »
page = « /jsp/extension/ops-full-search.jsp »
managed-bean= »OpsFullSearchDialog »
icon= »/images/icons/submit_large.gif »
title= »Recherche personnalisee »
description= »Renvoie la liste des documents OPS »>
<buttons>
<button id= »opsFullSearch_new »
label= »New search »
action= »#{DialogManager.bean.newSearch} »
disabled= »#{DialogManager.bean.newSearchDisabled} »

/>
</buttons>
</dialog>
</dialogs>
</config>
</alfresco-config>

 

Et voilà le résultat :

  • En mode recherche

CustomDialogueAlfresco

  • En mode résultat

CustomDialogueAlfrescoRes

<alfresco-config>

 <!-- Add custom dialog --> <config> <actions> <!-- Lancement de la boite de dialogue Full OPS --> <action id="ops_full_search"> <label>OPS recherche complete</label> <image>/images/icons/view_web_project.gif</image> <action>dialog:opsFullSearch</action> </action> <action-group id="navigator_actions"> <action idref="ops_full_search"/> </action-group> </actions> </config>

 <config>     <dialogs> <dialog name="opsFullSearch" page = "/jsp/extension/ops-full-search.jsp" managed-bean="OpsFullSearchDialog" icon="/images/icons/submit_large.gif" title="Recherche personnalisee" description="Renvoie la liste des documents OPS"> <buttons> <button id="opsFullSearch_new"  label="New search"  action="#{DialogManager.bean.newSearch}" disabled="#{DialogManager.bean.newSearchDisabled}"

 />  </buttons> </dialog> </dialogs> </config>    </alfresco-config>
alfrescologo

Alfresco 4 : les fonctionnalités

La dernière version de la solution de GED (gestion électronique de document) d’Alfresco, combine plusieurs domaines :

  • DM : Gestion de documents
  • RM : Gestion des archives
  • WCM : Gestion de contenus web
  • Share : Collaboration d’entreprise

[+] Lire la suite

numerisation

Numérisation – Acquisition

Le papier reste le support principal des échanges entre sociétés.
Il est facile d’intégrer dans votre informatique, les documents électroniques mais vous ne pouvez occulter les documents papiers. [+] Lire la suite

ged

Notre solution de GED

Comme tout le monde, vous êtes envahis par vos documents papiers, fichiers électroniques ou autres mails. Vous en avez assez d’imprimer vos documents pour simplement devoir les classer, ou pour les partager avec vos collaborateurs. [+] Lire la suite