Développement de site web: société Fpconcept

Pierre Pronchery



Remerciements

Je remercie toute l'équipe de Fpconcept, qui m'a apporté l'expérience et la fraicheur propres à l'intégration dans le projet d'une entreprise jeune: Franck Patissier, Benjamin Perrin, Fabien Dombard, Clément Delaunay, et Olivier Boisard. Plus loin que la simple réalisation de systèmes d'information avec des collègues de travail, et malgré les épreuves, ces projets ont créé et conforté des amitiés.

Je remercie également l'INSIA.

Table des matières
Résumé
Abstract
1. Déroulement du stage
1.1. Intitulé du stage
1.2. Encadrement
1.3. Dispositif technique
2. Organisation du développement
2.1. Planification
2.1.1. Gestion autonome
2.1.2. Gestion prévisionnelle
2.2. Validation du développement
2.2.1. Tests internes
2.2.2. Communication client
3. Processus de développement
3.1. Phase initiale
3.1.1. Décisions techniques
3.1.2. Conventions de développement
3.1.3. Structure du code
3.1.4. Portabilité
3.1.4.1. Visionneur générique
3.1.4.2. Menu horizontal dynamique
3.2. Spécialisation de la base de code
3.2.1. GTFC
3.2.2. GSalon
3.2.3. mon-cafe.com
3.2.3.1. Description du projet
3.2.3.2. Gestion des livraisons
Bilan
A. engine.php
Liste des illustrations
2-1. CVSweb
2-2. Site mon-cafe.com
3-1. Accueil de FPmanager
3-2. Menu horizontal

Résumé

Fpconcept est une jeune entreprise, orientée vers le développement de solutions logicielles. Projet démarré il y a 3 ans par Franck Patissier, Fpconcept a commencé son activité par la réalisation de sites web statiques. Rapidement rejoint par un second développeur, puis par un graphiste permanent, le projet a évolué vers la création de sites web dynamiques.

Après une série de sites web à vocation de vitrine sur Internet, le besoin d'une solution intégrée de gestion d'entreprise (ou "groupware") a été pressenti. Une première maquette a été réalisée avant de lancer le projet au début de l'année 2005. Nommé "FPmanager", il devait essentiellement être développé sous la forme d'une application web. C'est alors que j'ai pu m'intégrer à l'équipe en tant que développeur, de janvier à octobre 2005. L'équipe était composée d'un second développeur ainsi que d'un graphiste. Les objectifs du développement étaient un compromis de rapidité du développement, d'ergonomie, et de portabilité, sans en compromettre la sécurité. Mon rôle a essentiellement consisté en l'apport d'une méthode de développement et de connaissances techniques.

Le projet a été intégralement développé en PHP, couplé au système de gestion de base de données MySQL. Son interface avec l'utilisateur final se devait d'être totalement fonctionnelle avec un maximum de navigateurs existants. Pour cette raison, pour le respect des standards en place et pour accélérer le développement, les pages web générées par le système ont été conçues pour respecter les normes courantes du web, définies par le W3C. Sa réalisation a été entièrement effectuée à l'aide d'un système de gestion de révision CVS, afin d'assurer le suivi et la cohésion du projet dans l'équipe.

Si ce projet s'est révélé parfois complexe dans son développement, particulièrement les problèmes de portabilité, il a été également enrichissant dans sa gestion globale. Développé en concertation complète avec toute l'équipe, nous avons été malgré tout confrontés aux difficultés de planification et parfois de communication client. Cette expérience nous a permis de relativiser nos estimations des contraintes liées à des projets de développement.


Abstract

Fpconcept is a recently formed company, geared toward the development of software solutions. Its founder Franck Patissier, started the company 3 years ago. Fpconcept first geared its activity toward the creation of static web sites. Soon joined by a second developer and then a full-time graphist, the company's skills evolved to allow for the design of dynamic web sites.

After a series of internet web sites, the need for a complete company management suite, or "groupware", has been anticipated. A proof of concept was completed, and the project started by the beginning of year 2005. Called "FPmanager", it consisted mainly in a web-based application. That's exactly when I was able to join the team as developer, during a period from January to October 2005. The team included another developer and a graphic designer. The goal was to find a balance between rapid development, ergonomics, and portability, while always taking into account security issues. My role was to create a more rigorous development process, as well as lend my technical skills.

The project has been entirely developped with PHP coupled with MySQL relational database system. Its user interface had to be totally functional with a maximum of existing browsers. To achieve this, the pages generated were designed to comply with W3C's standards. The project was entirely maintained by the CVS revision control system, so as to ensure its visibility and coherence inside the team.

This project turned out to be often complex in its development, particularly with cross-browser issues. It was also interesting to be part of its global management. Despite the cohesion of the team all along, we faced planning and client communication issues. We all gained the experience of facing a project with such constraints.


Chapitre 1. Déroulement du stage

1.1. Intitulé du stage

Ma participation au projet de Fpconcept a été convenue comme "Développeur Informatique". Elle s'est déroulée de janvier à octobre 2005. Fpconcept est une jeune entreprise, employant 3 personnes. Elle se destine principalement au développement de sites web, mais réalise également des prestations de formation dans divers domaines.

Avant de rejoindre Fpconcept, j'ai également été intégré de novembre à décembre 2004 dans la société Netanswer, en "Maintenance et développement d'une application de gestion intégrée". Ce stage a été écourté, car:

  • le travail demandé et ses conditions ne correspondaient pas à ce qui avait été convenu au cours de l'entretien;

  • j'ai du mettre à disposition de l'entreprise mon matériel personnel, sans compensation pour les dommages survenus;

  • enfin, je considère avoir été harcelé pour travailler, ce même en arrêt médical et en dehors des horaires tolérables par la convention.

Fpconcept a commencé son activité par la création de sites internet. Après l'évolution du contenu statique vers dynamique, l'entreprise a proposé des solutions au graphisme se voulant novateur et efficace. Après une tentative déçue d'équipement d'infrastructures d'accueil en réseau sans fil, l'activité a été repensée autour de développements spécifiques. Un projet de logiciel intégré de gestion d'entreprise, ou "groupware", a été démarré. Ce projet serait lié aux technologies web, son support étant disponible sur la plupart des architectures existantes. Son financement a été assuré par des prestations de formation et d'assistance, notamment en administration de réseaux, prise en main de système d'information, ainsi qu'en gestion d'infrastructure télécom en voix sur IP (VoIP).

Ma mission a consisté à apporter une méthodologie de développement, tout en prenant une part significative dans les projets de l'entreprise liés aux technologies du web. Elle a essentiellement concerné le développement du projet de groupware, appelé "FPmanager".


1.2. Encadrement

L'intégralité du stage a été effectuée en collaboration avec Benjamin Perrin, le chef de projet et second développeur du projet "FPmanager", dans toutes ses déclinaisons. M. Perrin étant un développeur auto-didacte, il n'avait pas toute la rigueur propre aux formations dispensées en PHP et autres technologies web. Evoluant jusque là seul dans les projets de développement, il ne disposait pas non plus de méthode collaborative de développement.

Les éléments graphiques du site ont été fournis par Clément Delaunay, le graphiste du groupe. Il travaille notamment à l'aide de Photoshop, Dreamweaver et Flash.

Des stagiaires développeurs nous ont occasionnellement assisté: Olivier Boisard (FPmanager) et Tristan Hausser (partie d'administration de la déclinaison de vente en ligne). Tous deux débutaient dans les technologies liées au projet.

L'entreprise comprenait également Fabien Dombard, responsable technique. Il l'a quittée en août 2005.

Mon intégration au sein de l'équipe a été immédiate. L'ambiance au sein de l'équipe est toujours restée positive, et l'écoute respective était plus qu'appréciable.


1.3. Dispositif technique

Fpconcept dispose de locaux proches du centre d'affaires de La Défense, à Courbevoie (92). L'ensemble de la mission a été réalisé sur place. Les locaux comprennent une salle de réunion, ainsi que des tableaux blancs, largement utilisés lors des projets.

L'intégralité du développement (hors graphismes) a été réalisé à l'aide de technologies logicielles libres. Ces dispositifs regroupent la documentation, les outils de gestion, de développement et d'hébergement du projet: ils sont exploitables gratuitement et autorisent l'accès et la modification de leur code source, dans leurs conditions respectives. Les outils les plus importants sont:

  • développement: langage PHP, gestion de base de données MySQL, méthode collaborative CVS;

  • environnement de travail: système Debian GNU/Linux, éditeur VIM, navigateur Mozilla;

  • hébergement des sites: système FreeBSD, serveur HTTP apache;

  • documentation: définition des standards W3C, RFC de l'IETF, documentation des systèmes et logiciels déployés, et divers sites web.

La plate-forme de production des sites hébergés est confiée à un prestataire externe, Verio. Elle fournit l'accès à un serveur mutualisé en environnement sécurisé (jail FreeBSD), dont l'administration était confiée à M. Dombard. La gestion des noms de domaines est regroupée sur domaine.fr.


Chapitre 2. Organisation du développement

2.1. Planification

2.1.1. Gestion autonome

Jusqu'à la première déclinaison commerciale (GSalon) de FPmanager en mai 2005, la planification du projet s'est caractérisée par son absence. En effet, la première phase du projet consistait à développer une base de code suffisamment dynamique et simple pour en permettre une extension rapide. L'auto-gestion temporelle a été motivée également par la volonté d'obtenir un produit dont l'entreprise serait elle-même première utilisatrice, donc agréable et adapté. Ceci nous a permis de développer deux modules complets en moins de 2 mois, et sans précipitation. Le premier module, "FPcontact", est le carnet d'adresses; le second, "GTFC", est chargé de gérer les communications. Tous deux ont été intégrés autour d'une base de code commune.

Dans le même temps, nous avons proposé et déployé un site intranet collaboratif, phpwiki, référençant les différentes ressources déployées autour du développement, et contenant toutes les informations utiles par module (tables SQL, types de fichiers définis par exemple). Il a été complété par la mise en place d'une interface de visualisation de l'état du système CVS, cvsweb, et d'une interface de gestion de bugs, flyspray.

Figure 2-1. CVSweb

La première commande effective a été acceptée avec une contrainte temporelle très importante: développer un système complet de gestion d'événements de type "salon", avec une version livrable en deux semaines. Les différentes tâches ont été définies et effectuées en séquence, sur tableau blanc. Dans ces conditions, leur archivage a été délibérément laissé au système de gestion de développement collaboratif (CVS). Cette période de surcharge a néanmoins accouché d'une mise en production dans les temps.


2.1.2. Gestion prévisionnelle

Forts de cette expérience la seconde commande, un système de vente en ligne, nous a permis d'évaluer dès le départ la charge de travail à venir. Un cahier des charges a été réalisé, et accompagné d'une planification complète répartie sur 2 mois. Malheureusement, elle n'a pas pu être honorée, pour plusieurs raisons. Les plus importantes sont les suivantes:

  • factorisation du code à outrance: souhaitant réutiliser autant que code que possible, certaines fonctions (surtout l'affichage) sont devenues trop complexe à maintenir;

  • formation d'un stagiaire: M. Hausser nous a rejoint au cours du développement, sa formation au système s'est révélée plus longue que souhaitée;

  • communication client disproportionnée: elle s'est révélée insuffisante dans le premier projet majeur, puis trop influente dans le développement du second.

Figure 2-2. Site mon-cafe.com


2.2. Validation du développement

2.2.1. Tests internes

L'apport de la solution de gestion collaborative du développement (CVS) a été accompagné par une méthodologie d'utilisation. Les règles que j'ai proposées de respecter étaient:

  • tous les changements doivent être documentés;

  • aucune information liée au débogage, et non intégrée au système automatique de débogage en place, ne doit être laissée en place;

  • aucun changement n'est appliqué à moins d'être totalement fonctionnel, et de ne pas provoquer de problèmes connus au moment de son application.

ceci afin d'assurer la disponibilité à tout moment d'une version fonctionnelle de qualité de l'application.

Tout au long du développement, des tests de vérification ont été menés manuellement par les développeurs. Cette méthode n'est malheureusement pas exhaustive, et parfois lourde temporellement, mais dans le cas d'un développement web il n'existe pas à ma connaissance de méthode automatisée. Ce manque a été compensé par le découpage et la méthode de développement. La cohérence de la base de données a été assurée par l'utilisation de contraintes d'intégrité. L'affichage optionnel d'informations liées au développement a également facilité cette tâche. En voici un exemple:

Info: module "commerce", action "account"
Info: Array
(
    [user_id] => 2
    [user_name] => ppronchery
    [user_admin] => 1
    [user_export] => 0
    [basket] => Array
        (
        )
)
Info: SELECT fp_commerce_option_value.name,
fp_commerce_product_category.product_category_id AS category_id,
fp_commerce_option_value.option_value_id
FROM fp_commerce_product_category
LEFT JOIN fp_commerce_option_category ON
fp_commerce_product_category.product_category_id
=fp_commerce_option_category.product_category_id
LEFT JOIN fp_commerce_option ON
fp_commerce_option_category.option_id=fp_commerce_option.option_id
LEFT JOIN fp_commerce_option_value ON fp_commerce_option.option_id
=fp_commerce_option_value.option_id WHERE
fp_commerce_product_category.name='accessoire' AND
fp_commerce_option.name='type' ORDER BY name ASC
Info: SQL execution time: 0s and 2.682ms
Info: Page execution time: 0s and 61.718ms
				


2.2.2. Communication client

Toute la communication liée aux projets et sortant du cadre de l'entreprise a été effectuée par M. Perrin, afin d'en assurer la cohésion. Elle a malheureusement soulevé de nombreux problèmes, expliquant partiellement le retard de la solution de vente.

En effet, le développement éclair de la solution de gestion de salons n'a pas immédiatement satisfait le client, ses besoins n'ayant certainement pas été suffisamment définis au moment de la commande. Les ajustements survenus ont pénalisé le projet lui succédant.

Ayant pris en compte ce problème, l'avancée du développement de la solution de vente en ligne a été suivie étroitement avec le client. Ceci a donné lieu à des changements de direction multiples, de nouveaux concepts ayant été pensés au fur et à mesure de la validation. Ils ont pénalisé l'avancée de la tâche de développement.


Chapitre 3. Processus de développement

3.1. Phase initiale

3.1.1. Décisions techniques

Les choix les plus importants sont le langage de programmation et la plate-forme d'hébergement. Le couple PHP/MySQL a été choisi car il était déjà en place sur de nombreux sites de l'entreprise, et maitrisé par l'équipe en place. L'hébergement sur serveur mutualisé FreeBSD a été choisi pour des raisons de coût et de liberté d'administration. Les ressources processus y étant limitées, il n'était pas envisageable de déployer de service supplémentaire. Cependant, le développement a été pensé afin de ne pas totalement contrarier les possibilités de migration vers un autre système de gestion de base de données: la version initiale de FPcontact fonctionnait indifféremment avec PostgreSQL ou MySQL.

Par ailleurs, le choix des logiciels libres était justifié par des raisons de coût (pas de licenses commerciales), de stabilité, et de clarté d'utilisation en développement. Ils étaient également déjà en place avant mon arrivée dans l'entreprise. Seuls les logiciels liés au graphisme étaient propriétaires, car leurs technologies ont été exigées par certains clients.


3.1.2. Conventions de développement

Ma courte expérience préalable de développement, après discussions avec l'équipe, m'a conduit à imposer certaines règles de développement. L'objectif étant la clarté et la simplicité du code produit, il a été décidé de:

  • rédiger intégralement le code en anglais (inclus les journaux CVS et la base de données), afin de garantir une cohérence avec les langages utilisés, et dans le code rédigé;

  • formatter le code intégralement avec les mêmes conventions, à savoir "1 ligne est une instruction", les signes délimitant les blocs de code ("{" et "}") sont seuls sur leur ligne, et le placement est celui défini par défaut dans le logiciel "vim";

  • écrire le code de sorte à éviter d'avoir recours aux commentaires, en le segmentant en fonctions courtes (25 lignes maximum si possible), et en nommant les variables de façon aussi intelligible que possible.

Dans le cas de développement tel que celui-ci, quasi entièrement orienté autour d'opérations de mise à jour et affichage, et avec les contraintes temporelles rencontrées, une modélisation formelle du développement en aval nous a paru superflue. Elle a été réalisée sur tableau blanc, au fur et à mesure du développement.


3.1.3. Structure du code

Dés le départ, le développement a été pensé de sorte à simplifier au maximum le processus de développement, sans en sacrifier ses possibilités. Ceci a d'abord donné lieu à la création d'un moteur minimal de gestion de modules, "engine.php", inclus en Annexe A. Le code redondant sans être indispensable au fonctionnement du moteur a été placé à part, pour intégration au besoin (répertoire "system").

En effet, chaque fonctionnalité majeure a fait l'objet d'une séparation distincte de son code en "modules". Un module est chargé au besoin, par l'utilisateur directement ou par un autre module. Chaque module dispose d'un certain nombre de points d'entrées, ses fonctions nommées "module_action". L'action "default" est celle appelée par défaut. L'action "system" est appelée automatiquement avant toute chose par le moteur, si elle existe et si le module a été appelé directement par l'utilisateur. Elle permet l'altération du comportement par défaut du moteur, pour forcer une redirection, ou effectuer une sortie PDF par exemple.

Ainsi, chaque action logique de la part de l'utilisateur, et chaque présentation de l'information a été réalisée dans une fonction séparée, automatiquement exportée par le système de gestion de modules. Bien sûr, il a été pris soin de ne pas exposer d'autres fonctions par ce système.

Tout le code de rendu HTML a été placé dans des fichiers séparés, nommés avec l'extension ".tpl" pour "templates". Le code PHP présent dans ces fichiers a été limité autant que possible à l'affichage de variables, avec d'éventuelles boucles ou conditions.

Ce choix de fonctionnement m'a semblé évident, d'abord par mon expérience personnelle de développement en PHP (adaptations de PHP-Nuke), par ma culture du développement objet, ainsi que mes notions de développement système (C et interpréteurs). En effet, chaque module ici regroupe un ensemble de méthodes par fonctionnalités, sans s'encombrer des contraintes d'un système purement objet. Ce choix a été accompagné en conséquence de toute la rigueur possible, conscients de l'absence de ce contrôle supplémentaire.

De plus, la fonction PHP "call_user_func_array()", essentielle dans ce type de fonctionnement, nous a semblé suffisamment performante. Elle effectue une recherche dans la liste des fonctions définies par l'utilisateur, et appelle directement la fonction correspondante avec les arguments voulus. Il s'agit d'une facilité analogue à dlopen()/dlsym() en C, permettant la recherche de fonctions à l'intérieur même d'un programme en cours d'exécution.

Figure 3-1. Accueil de FPmanager


3.1.4. Portabilité

La flexibilité de l'environnement d'exécution du code a déjà été définie, et délimitée à une solution précise. La portabilité ciblée ici est donc uniquement du côté du client: il faut que le projet soit utilisable quel que soit son environnement. L'interface a donc été testée tout au long du développement sur les trois navigateurs les plus courants: Internet Explorer, Mozilla, et Opera. Le navigateur de référence choisi est Mozilla, pour sa disponibilité sur Debian et FreeBSD, sa documentation et sa fidélité aux standards. Nous n'avions malheureusement pas accès à Safari (Mac OS X), mais des vérifications régulières avec Konqueror (son moteur web étant proche de celui de Safari) nous ont permis de maintenir son utilisation fonctionnelle.

L'utilisation de la norme XHTML 1.1 pour l'interface a facilité le développement du système. En effet, le code généré n'est qu'un formatage organisé des données à afficher. C'est le système de feuilles de styles CSS, accompagnant les pages, qui détermine l'aspect du site. Si son support est optimal dans Mozilla et Opera, il n'en est pas de même pour Internet Explorer. Deux exemples nous ont particulièrement posé problème: un affichage tabulaire composé d'enchainements d'élements "div", ainsi qu'un système de menu horizontal, avec auto-affichage par le passage de la souris.


3.1.4.1. Visionneur générique

Afin d'accélérer le développement, et de garantir un aspect cohérent à toutes les parties réalisées, nous avons décidé de dédier un module de code à l'affichage des données. Appelé "fpexplorer", ce visionneur est capable d'afficher autant aux formats:

  • détails, où toutes les colonnes disponibles, sont affichées, et une icône descriptive présente en début de ligne (par exemple, une liste de contacts avec leurs coordonnées);

  • liste, où seule une icône avec sa description est affichée (utile afin de naviguer dans un grand nombre de données);

  • vignettes, où seule une image accompagnée d'une description est affichée (agréable lors du parcours de fichiers ou d'images).

Ce système a été conçu afin de pouvoir passer d'une vue à l'autre instantanément, au bon vouloir de l'utilisateur, et donc sans recharger la page. L'aspect visuel voulu est identique aux navigateurs de fichiers natifs disponibles sur la plupart des systèmes d'exploitation grand public. Pour cela, la convention de sortie XML suivante a été définie:
<form name="explorer_n" class="explorer"> [a]
    <input type="hidden" name="nom" value="valeur"/> [b]
    <div id="explorer_n" class="listing_default"> [c]
        <div class="toolbar">Contenu de la barre
        d'outils</div> [d]
        <div class="header">
            <div class="icon"></div>
            <div class="name">Nom</div>
            <div class="colonne_suivante">En-tête de colonne</div>
        </div>
        <div class="entry">
            <input style="display: none" type="checkbox"
            name="entry_i"/> [e]
            <div class="icon">Image pour l'icône</div>
            <div class="thumbnail">Image pour la vignette</div>
            <div class="name">Nom</div>
            <div class="colonne_suivante">Contenu de la colonne</div>
        </div>
        <div style="clear: left">&nbsp;</div> [f]
    </div>
</form>
					
Il est possible d'utiliser plusieurs instances de l'explorateur au sein d'une même page, grâce au nom donné au formulaire [a]. Selon les paramètres fournis, l'explorateur intègre une série de paramètres au formulaire [b], ou pour chaque donnée listée [e]. La barre d'outil optionnelle [d] sert notamment à changer de type de vue, celle utilisée par défaut figurant dans le "div" avec l'identifiant de l'explorateur [c].

En plus de ce système, deux points d'entrée de "fpexplorer" sont disponibles:

  • le premier reformatant l'intégralité des contenus des colonnes supplémentaires, afin d'éviter les injections de code HTML ou Javascript dans la page de l'utilisateur;

  • le second laissant au développeur le soin d'effectuer ces tests, mais lui permettant par là d'intégrer du code HTML. Cette fonction a été utilisée afin d'intégrer des liens, des images, et des cases de couleur dans certaines colonnes.

Le problème de portabilité survenu concernait la vue tabulaire avec Internet Explorer. En effet, elle était impossible à assurer avec redimensionnement de largeur automatique dans les colonnes désirées. Dans ce cas précis, une mesure visant à détecter le navigateur utilisé a été prise. Elle n'a pas été faite en adaptant la sortie au navigateur détecté, par exemple à l'aide de son "User-Agent" déclaré au serveur web, ni par une détection Javascript, car dans les 2 cas d'autres navigateurs se font passer pour Internet Explorer (notamment Opera), alors qu'ils ne présentent pas le bug. De plus, d'autres navigateurs utilisent le moteur graphique de Internet Explorer. La mesure prise a donc été d'exploiter un bug dans la gestion des commentaires des CSS, dans Internet Explorer. Cette technique, décrite sur Internet, nous a permis de faire une exception pour ce navigateur, en forçant la largeur des colonnes.

Enfin, ce système pourrait encore être amélioré. En effet, il est très lié à Javascript, et en dépend pour certaines opérations. De plus, un navigateur gérant les CSS mais sans support Javascript masque les contrôles de formulaires, alors qu'ils lui sont indispensables, leur activation étant d'ordinaire émulée par des interactions avec les contenus eux-mêmes (afin de garantir la cohérence avec l'aspect d'un navigateur traditionnel).


3.1.4.2. Menu horizontal dynamique

Le second problème de portabilité majeur rencontré concerne la création d'un menu déroulant, avec en-têtes disposés en ligne. Cette technique, normalement possible en CSS seule, a nécessité l'ajout de code Javascript. Internet Explorer en particulier ne supporte pas ce mécanisme sinon. Mozilla n'a pas nécessité cette astuce, mais a également causé un problème: la combinaison de cette technique avec des éléments définis en overflow en fond échoue (lorsqu'on autorise le contenu d'une section à défiler si il en dépasse la taille prévue). Ces deux problèmes sont connus et discutés sur Internet, et le bug référencé pour Mozilla (il est corrigé dans la prochaine version majeure).

Figure 3-2. Menu horizontal


3.2. Spécialisation de la base de code

3.2.1. GTFC

GTFC signifie "Gestion Téléphone Fax Communications". Il s'agit d'un module permettant la gestion quotidienne des appels entrants, et permettant également l'envoi de message entre utilisateurs. Chaque événement donne lieu à l'émission d'un message par courrier électronique, adressé à la personne concernée.

Ce module a constitué la première occasion de tester l'interaction entre modules. Celle-ci a d'abord été considérée comme un succès, l'ajout de peu de code ayant été nécessaire à FPcontact pour l'intégration totale avec le carnet d'adresses. Un premier problème majeur a été soulevé cependant, avec l'emploi d'un groupe de contacts, "GTFC", afin de définir les membres susceptibles d'être concernés par les communications gérées par ce module. En effet ce groupe est retrouvé par son nom, ce qui est peu efficace. Mais surtout, il est modifiable et supprimable par tout utilisateur potentiel de l'interface. Ceci peut en empêcher le bon fonctionnement, sans frein à l'utilisateur. Le compromis de souplesse et d'élégance a été considéré initialement satisfaisant, et maintenu à ce jour.

Par la suite, l'interaction entre modules a mené à des problèmes parfois sévères. Ils sont abordés dans les modules décrits ci-après. D'autre part, le type de solution apporté aux contacts dits "GTFC" a été reproduit, sans souci particulier.


3.2.2. GSalon

GSalon est le module de gestion d'événements de type "salon". Il étend le système de carnet d'adresses en y ajoutant des catégories d'exposants et de visiteurs, qui peuvent être liés à une instance de salon particulière. Leur consultation est facilitée par l'ajout d'un système de filtrage, générant automatiquement les formulaires et requêtes SQL associées. Les critères de filtrage ont une base commune, et sont étendus aux champs d'éventuels questionnaires présentés lors de l'inscription d'un visiteur.

L'inscription des exposants est également gérée, et bénéficie d'une étape de confirmation à l'attention de l'administrateur du salon.

C'est après avoir développé ce module que nous avons rencontré les premiers problèmes liés à la réutilisation de code. En effet, le client a demandé des modifications parfois profondes du système pendant sa maintenance. Celles-ci se sont révélées pénibles à réaliser car le code était devenu tentaculaire lors des opérations d'affichages. Elles ont vu leur liste de paramètres gonfler, afin de gérer différents titres, barres d'outils, et directions de liens entre autres. Après réflexion, il aurait été intéressant de décliner ces opérations dans certains cas, afin de conserver le code général simple.


3.2.3. mon-cafe.com

3.2.3.1. Description du projet

Ce projet est le plus ambitieux des modules étendant FPmanager. Il s'agit d'un système complet de vente en ligne, gérant:

  • la mise en ligne de produits;

  • la vente au détail ou en abonnement;

  • les livraisons, avec suivi de l'état des stocks;

  • l'inscription de consommateurs avec évaluation automatique du besoin;

  • le tout en deux parties, front-office (site web complet de culture et vente autour du café) et back-office (interface intégrée de gestion, à l'attention du personnel de maintenance).


3.2.3.2. Gestion des livraisons

Un des points forts du site concerne les abonnements. Cependant, il a fallu trouver une méthode flexible pour déterminer la répartition des livraisons. Les contraintes étaient les suivantes:

  • le nombre de livraisons devait être au maximum de 12 par an;

  • le calcul des livraisons devait être annuel;

  • les livraisons devaient peser au moins 3 Kg;

  • chaque livraison devait bien sûr être suffisante jusqu'à la prochaine.

J'ai donc élaboré un algorithme afin de résoudre ce problème. Il s'agit de trouver l'espace maximal possible entre 2 livraisons successives. Cet écart n'est pas régulier, car certains nombres entre 1 et 12 ne sont pas des diviseurs de 12. Les deux paramètres étant le nombre de livraisons à effectuer et le mois en cours, leur multiplication prend sens: le reste de sa division par 12 présente la régularité souhaitée. Il suffit alors d'en extraire les valeurs inférieures aux livraisons à effectuer, et on obtient le tableau suivant:

 JanFévMarAvrMaiJuiJuiAoûSepOctNovDéc
1000000000001
2000001000001
3000100010001
4001001001001
5001010010101
6010101010101
7010101101011
8011011011011
9011101110111
10011111011111
11011111111111
12111111111111

où "1" signifie une livraison, et "0" l'autre cas. La formule utilisée est la suivante (en pseudo-code PHP):
($count * $month) % 12 < $count ? 1 : 0
					
Elle n'est pas encore suffisante en l'état. En effet, il faut commencer le tableau par la droite, car il faut toujours livrer le premier mois, et le plus possible à la suite. De plus, ici on assume que la première livraison est effectuée en janvier; la rotation est annuelle mais doit commencer dès que le client commande. La formule définitive devient:
($count * (12 - (($month + $initial_month) % 12))) % 12 < $count ? 1 : 0
					
Elle est utilisée pour les livraisons et la facturation des abonnements.


Bilan

Je pense avoir largement transmis mon savoir-faire technique à l'équipe de Fpconcept, tant au niveau de la méthode de développement, que dans la maitrise des technologies web. Cette collaboration mutuelle m'a également bénéficié, car je n'avais encore aucune expérience dans le développement intégral d'un projet d'entreprise. J'ai pu conforter mes compétences en développement, progresser en équipe, et participer à toutes les étapes d'un projet.

La réalisation de la base de code du groupware, soit les modules de carnet d'adresses et de communications nous a pleinement satisfaits. Ils sont couramment utilisés au sein de l'entreprise, permettant même l'accès sécurisé à distance de son système d'information. La première déclinaison de la base de code développée a été déployée avec succès, participant à la gestion du salon de la copropriété en octobre 2005.

Je regrette cependant que le dernier projet réalisé, "mon-cafe", ne soit encore en production. Ses prévisions initiales de développement ont été largement dépassées. Nous pensons être conscients des erreurs commises, et ce rapport a tenté d'en faire une synthèse: l'estimation de la charge de travail, la gestion des ressources humaines, les changements du cahier des charges nous en semblent la cause. La plate-forme de vente est actuellement en phase de finition. Une fois terminée, sa mise en production ne dépendra plus que de l'enregistrement de son certificat SSL (sécurité des transactions).

Ce stage est certainement atypique dans le contexte de ma spécialisation en "Systèmes, réseaux, télécoms" à l'INSIA. Cette année de formation a même été limitée en projets de développement. Espérant me destiner au développement de logiciels systèmes, le projet réalisé ici m'a permis de compléter mon année d'enseignement.


Annexe A. engine.php

<?php
//This file is part of FPmanager
//Copyright (c) 2005 FPconcept



//check url
if(!ereg('/index.php$', $_SERVER['PHP_SELF']))
{
  header('Location: index.php');
  exit(0);
}


//global variables default values
$debug = 1;
$html = 1;
$user_id = 0;
$user_name = 'Anonymous';
$user_admin = 0;
$user_export = 0;

//site-specific variables
include('config.php');

//essential toolbox
require_once('system/debug.php');
require_once('system/sql.php');

//session variables
session_set_cookie_params(31536000);
session_start();
if(isset($_SESSION['user_id']) && sql_single('SELECT enable FROM fp_user'
      ." WHERE user_id='".$_SESSION['user_id']."';"))
{
  $user_id = $_SESSION['user_id'];
  if(isset($_SESSION['user_name']))
    $user_name = $_SESSION['user_name'];
  if(isset($_SESSION['user_admin']))
    $user_admin = $_SESSION['user_admin'];
  if(isset($_SESSION['user_export']))
    $user_export = $_SESSION['user_export'];
}

//if HTML load template
require_once('system/module.php');
if($html)
{
  require_once('system/html.php');
  html_start();
  html_template($template);
  html_stop();
}
else
  module();

?>