casdastre: initial import.

This commit is contained in:
glenux 2009-05-01 08:39:36 +00:00
commit 2c14ce45e6
96 changed files with 6041 additions and 0 deletions

183
DAajoute.php Normal file
View file

@ -0,0 +1,183 @@
<?php
/*
* Initialisation des chemins d'acces aux librairies
* de fonctions
*/
include("includes.inc.php");
$page=new Page(__FILE__);
$_SESSION["referer"]=basename(__FILE__);
$page->logCheck();
$page->startScript();
include("includes/scriptJS_DA.inc.php");
$page->endScript();
$page->startHeader();
?>
<link rel="stylesheet" href="/styles/contenuDA.css" />
<?php
$page->endHeader();
$familles = donne_familles();
$unite="* unit&eacute;";
switch($_POST["action"]) {
case "Ajouter": {
$famProd=$_POST["famille"];
$prodSelect=$_POST["produit"];
$quantiteDem=$_POST["quantite"];
$prodUnit=$_POST["unite"];
if (!isset($_SESSION["demandeAchat"])){
$_SESSION["demandeAchat"]=new DemandeAchat(
$_SESSION["userInfo"]->getID()
);
}
$_SESSION["demandeAchat"]->ajouteLDA($famProd,$prodSelect,$quantiteDem);
};
break;
case "Supprimer": {
if (isset($_SESSION["demandeAchat"])){
$_SESSION["demandeAchat"]->supprimeLDA($_POST["Case_suppr"]);
}
// TODO: faire en sorte de supprimer le bug
// qui permet d'avoir des produits n'appartenant pas
// à la bonne famille
} ;
break;
case "Annuler": {
// TODO: faire en sorte de supprimer le bug
// qui permet d'avoir des produits n'appartenant pas
// à la bonne famille
}; break;
// TODO: lorsque l'on fait un Annuler faire en sorte que
// les produits correspondent bien à la famille
case "Valider": {
if (isset($_SESSION["demandeAchat"])){
$_SESSION["demandeAchat"]->insereBD();
unset($_SESSION["demandeAchat"]);
header("Location: DAliste.php");
}
}; break;
default: break;
}
$page->startContent();
?>
<div id="contenuDA">
<h1>Demande d'Achat</h1>
<h2>Livraison</h2>
<fieldset>
<legend><b>Date et horaires</b></legend>
<p> Date :
<input type="text" name="jour" value="<?php print date("d")+1; ?>" class="livraison" size="2" maxlength="2" />
/
<input type="text" name="mois" value="<?php print date("m"); ?>" class="livraison" size="2" maxlength="2" max="12" />
/
<input type="text" name="annee" value="<?php print date("Y"); ?>" class="livraison" size="4" maxlength="4" min="2004" />
</p>
<p>
Horaire :
<ul>
<li>
A partir de
<input type="text"
name="heures_min"
value="08"
size="2"
class="livraison"
maxlength="2" /> h
<input type="text"
name="mins_min"
value="00"
size="2"
class="livraison"
maxlength="2" />
</li>
<li>
Jusqu'à
<input type="text"
name="heures_max"
size="2"
value="19"
class="livraison"
maxlength="2" /> h
<input type="text"
name="mins_max"
size="2"
value="30"
class="livraison"
maxlength="2" />
</li>
</ul>
</p>
</fieldset>
<h2>Ajout d'un nouveau produit</h2>
<form name="form"
method="post"
action="DAajoute.php"
enctype="application/x-www-form-urlencoded">
<noscript>
<p style="border: 1px solid #f00; padding:5px;">
Pour passer votre commande vous devez pouvoir utiliser JavaScript.
Veuillez contacter votre administrateur pour plus de de&eacute;tails.
</p>
</noscript>
<p>
<select name="famille"
onChange="changeFam_Prod(this.form.famille,this.form.produit);" >
<?php
for($i=0;$i<count($familles);$i++) {
menu_deroulant_familleProd($familles[$i]);
}
?>
</select>
<select name="produit">
<?php
$prod = trouve_produits(1);
for($i=0;$i<sizeof($prod);$i=$i+2) {
menu_deroulant_Produits($prod[$i], $prod[$i+1]);
}
?>
</select>
Quantité :
<input type="text" name="quantite"><?php print $unite ?>
</p>
<p>
<input type="hidden" name="unite" value"<?php print $unite;?>" />
<input type="reset" name="action" value="Annuler" />
<input type="submit" name="action" value="Ajouter" />
</p>
<?php
if (isset($_SESSION["demandeAchat"])){
if ($_SESSION["demandeAchat"]->_ligneIdx>0){
print "<fieldset>\n";
print "<legend><b>Lignes de demandes d'achat</b></legend>\n";
print $_SESSION["demandeAchat"]->toHTML(1);
print "</fieldset>\n";
print "<input type=\"submit\" "
."name=\"action\" class='valider' "
."value=\"Valider\" />"; }
}
?>
</form>
</div>
<?php
$page->endContent();
print $page->toHTML();
?>

72
DAliste.php Normal file
View file

@ -0,0 +1,72 @@
<?php
/*
* Initialisation des chemins d'acces aux librairies
* de fonctions
*/
include("includes.inc.php");
$page=new Page(__FILE__);
$_SESSION["referer"]=basename(__FILE__);
$page->logCheck();
$page->startHeader();
?>
<link rel="stylesheet" href="/styles/contenuDA.css" />
<?php
$page->endHeader();
$listeDA_cree=new ListeDA("CREE",$_SESSION["userInfo"]->getID());
$listeDA_cree->loadListe();
switch($_POST["action"]) {
case "Supprimer": {
// TODO: supprimer demande d'achat de la table
// ainsi que les lda correspondant etc.
$listeDA_cree->supprimeDA($_POST["demande_achat"]);
};
break;
default: break;
}
$page->startContent();
?>
<div id="contenuDA">
<h1>Demandes d'achats en cours</h1>
<h2>Demandes d'achats non traitées</h2>
<?php
print "<form name=\"form\" "
."method=\"post\" "
."action=\"DAliste.php\" "
."enctype=\"application/x-www-form-urlencoded\" "
.">";
print $listeDA_cree->toHTML();
if (count($listeDA_cree->_liste)>0){
print "<input type=\"submit\" name=\"action\" value=\"Supprimer\" />";
}
print "</form>";
?>
<h2>Demandes d'achat en cours de traitement</h2>
<?php
$listeDA_envoye=new ListeDA("COMM",$_SESSION["userInfo"]->getID());
$listeDA_envoye->loadListe();
print $listeDA_envoye->toHTML(0);
?>
</div>
<?php
// on affiche les lignes de demande d'achat
$page->endContent();
print $page->toHTML();
?>

121
DAstock.php Normal file
View file

@ -0,0 +1,121 @@
<?php
/*
* Initialisation des chemins d'acces aux librairies
* de fonctions
*/
include("includes.inc.php");
$page=new Page(__FILE__);
$_SESSION["referer"]=basename(__FILE__);
$page->logCheck();
$page->startScript();
include("includes/scriptJS_DA.inc.php");
$page->endScript();
$page->startHeader();
?>
<link rel="stylesheet" href="/styles/contenuDA.css" />
<?php
$page->endHeader();
$page->startContent();
switch($_POST["action"]) {
case "Accepter": {
if($_SESSION["produit"]) {
if($_SESSION["produit"]->exists()) {
$_SESSION["produit"]->_stock=$_POST["stock"];
$_SESSION["produit"]->_seuil_min=$_POST["seuil_min"];
$_SESSION["produit"]->_seuil_max=$_POST["seuil_max"];
$_SESSION["produit"]->modifSeuils();
unset($_SESSION["produit"]);
}
else {
$_SESSION["produit"]->_stock=$_POST["stock"];
$_SESSION["produit"]->_seuil_min=$_POST["seuil_min"];
$_SESSION["produit"]->_seuil_max=$_POST["seuil_max"];
$_SESSION["produit"]->insereInfos();
unset($_SESSION["produit"]);
}
}
};break;
case "Modifier": {
$_SESSION["produit"]=new ProduitInterne($_POST["produit"], $_SESSION["userInfo"]->getSite());
$_SESSION["produit"]->rempliVals();
};break;
case "Supprimer": {
if($_SESSION["produit"]) {
if($_SESSION["produit"]->exists()) {
$_SESSION["produit"]->supprProStck();
}
unset($_SESSION["produit"]);
}
};break;
default: break;
}
?>
<div id="contenuDA">
<h1>Gestion des stocks</h1>
<form name="form"
method="post"
action="DAstock.php"
enctype="application/x-www-form-urlencoded">
<noscript>
<p style="border: 1px solid #f00; padding:5px;">
Pour passer votre commande vous devez pouvoir utiliser JavaScript.
Veuillez contacter votre administrateur pour plus de de&eacute;tails.
</p>
</noscript>
<p>
<select name="famille"
onchange="changeFam_Prod(this.form.famille,this.form.produit)">
<?php
for($i=0;$i<count($familles);$i++) {
menu_deroulant_familleProd($familles[$i]);
}
?>
</select>
<select name="produit">
<?php
$prod = trouve_produits(1);
for($i=0;$i<sizeof($prod);$i=$i+2) {
menu_deroulant_Produits($prod[$i], $prod[$i+1]);
}
?>
</select>
<br />
<p>
<input type="reset" name="action" value="Annuler" />
<input type="submit" name="action" value="Modifier" />
</p>
<?php
if($_SESSION["produit"]) {
print $_SESSION["produit"]->toHTML();
}
?>
</form>
</div>
<?php
$page->endContent();
print $page->toHTML();
?>

0
HEADER Normal file
View file

34
Makefile Normal file
View file

@ -0,0 +1,34 @@
PRJNAME=CasDAstre
GDATE:= $(shell date +"%Y-%m-%d_r%H%M")
GFILENAME:= $(PRJNAME)-$(GDATE).tar.bz2
PATH_GFILENAME:= ../$(GFILENAME)
LOCALDIR=$(shell pwd)
all: nothing
nothing:
# do nothing
update: clean
./tools/cda-update
myupdate: clean
./tools/mycda-update
clean:
rm -f *.php~
$(MAKE) -C doc clean
package: clean createpackage sendtoarchives
createpackage:
#mv lib ../lib$(GDATE)
tar -cjvf $(PATH_GFILENAME) -C ../ $(PRJNAME)
#mv ../lib$(GDATE) lib
sendtoarchives:
mkdir -p ../Archives
mv $(PATH_GFILENAME) ../Archives

0
README Normal file
View file

2
VERSION Normal file
View file

@ -0,0 +1,2 @@
hoplui eh
0.0

0
cache/README vendored Normal file
View file

15
classContFourn.php Normal file
View file

@ -0,0 +1,15 @@
<?php
class ContFourn {
//variable contenant les droits de l'objet
//créé (lecture uniquement (01 base 2), lecture/écriture... (11 base 2))
var $_droits;
function ContFourn($config)
{
}
}
?>

130
commandes.php Normal file
View file

@ -0,0 +1,130 @@
<?php
include("includes.inc.php");
$page=new Page(__FILE__);
$_SESSION["referer"]=basename(__FILE__);
$page->logCheck();
$page->startScript();
?>
// prod_ref.options[makeselector.selectedIndex].text; */
function showDA(prod_ref){
var refSelected=document.forms["cmd_gen"].reference.value;
var lgth = document.forms["cmd_gen"].reference.options.length;
for (i=0;i<lgth;i++){
refHide=document.forms["cmd_gen"].reference.options[i].value;
objHide=document.getElementById(refHide);
objHide.style.display="none";
objHide.style.visibility="hidden";
}
objVisible=document.getElementById(refSelected);
objVisible.style.display="block";
objVisible.style.visibility="visible";
}
<?php
$page->endScript();
$page->startContent();
switch($_POST["action"]){
case "Ajouter": {
$refprod=$_POST["reference"];
$fournisseur=$_POST["fourn_$refprod"];
$LDAtab=&$_POST["da_$refprod"];
if (!isset($_SESSION["commande"])){
$_SESSION["commande"]=new Commande(
$_SESSION["userInfo"]->getID()
);
}
$_SESSION["commande"]->ajouteLC($refprod,$LDAtab,$fournisseur);
}; break;
case "Supprimer": {
if (isset($_SESSION["commande"])){
$_SESSION["commande"]->supprimeLC($_POST["ligneCom"]);
}
}; break;
case "Valider": {
$_SESSION["commande"]->valideLC();
unset($_SESSION["commande"]);
print "<span class='error'>Commandes effectuées</span>";
//header("Location: listecommandes.php");
}; break;
default: break;
}
$cmdTool=new CmdTool(getFamilleFromAcheteur($_SESSION["userInfo"]->getID()));
$cmdTool->chargeRef();
?>
<div id="contenu">
<h1>Générer des commandes</h1>
<form name="cmd_gen"
method="post"
action="commandes.php"
enctype="application/x-www-form-urlencoded">
<fieldset>
<legend>Lignes d'Achat en attente</legend>
<p>Références des produits :
<select name="reference"
onClick="showDA(); false;" >
<?php print $cmdTool->ReftoHTML(); ?>
</select>
</p>
<?php
for ($i=0;$i<count($cmdTool->_ref_in);$i++){
$ref=$cmdTool->_ref_in[$i];
print "<p id=\"$ref\" name=\"$ref\" "
."style=\"display: none; visibility:hidden;\" >";
print "<span style='display:block'>";
print "Demande d'achats correspondant à <b>$ref</b>";
print "</span>";
print "<span style='display:block'>";
print $cmdTool->LDAtoHTML($ref);
print "</span>";
print "<span style='display:block'>";
print "Fournisseur disponibles pour <b>$ref</b> ";
print "</span>";
print "<span style='display:block'>";
print $cmdTool->FournToHTML($ref);
print "</span>";
print "</p>";
}
?>
<input type="submit" id="action" name="action" value="Ajouter" />
</fieldset>
<br />
<?php
if (isset($_SESSION["commande"])){
print "<fieldset>";
print "<legend>Commandes en cours</legend>";
print $_SESSION["commande"]->toHTML();
}
?>
</fieldset>
<?php
if (isset($_SESSION["commande"])){
print "<input type=\"submit\" name=\"action\" id=\"action\" value=\"Valider\" />";
}
?>
</form>
</div> <!-- contenu !-->
<?php
$page->endContent();
print $page->toHTML();
?>

0
config/README Normal file
View file

21
config/db.conf.php Normal file
View file

@ -0,0 +1,21 @@
<?php
if (!defined(DB_CONF)){
define(DB_CONF,1);
//-----------------------------------------------
// informations de connexion à la base de données
//-----------------------------------------------
// nom du serveur (ex: shamox.ath.cx ou localhost) | server name
define(SQL_SERVER,"localhost");
// nom de l'utilisateur de la base de données | database user name
define(SQL_USER,"CasDAstre");
// mot de passe de l'utilisateur de la base de données | password
define(SQL_PASSWD,"CasDAstreSQLpass");
// nom de la base de données | database name
define(SQL_BASE,"casdastre");
}
?>

5
data/bodyend.inc.php Normal file
View file

@ -0,0 +1,5 @@
</div> <!-- columnContent !-->
</body>
</html>

12
data/bodystart.inc.php Normal file
View file

@ -0,0 +1,12 @@
</head>
<body>
<div id="header">
<h1>
<img src="/icones/dastrenet.png" alt="Logo" />
D'Astre.Net
</h1>
</div>
<?php include("menugauche.inc.php"); ?>
<div id="columnContent">

21
data/footer.inc.php Normal file
View file

@ -0,0 +1,21 @@
<div id="footer">
<span class="validator" > <!-- validateurs !-->
<a href="http://validator.w3.org/check/referer" >
Valid XHTML 1.0
</a>
<a href="http://jigsaw.w3.org/css-validator/" >
Valid CSS 2
</a>
</span> <!-- validator !-->
<p>
Site r&eacute;alis&eacute; par
LAURES Roland,
ROLLAND Glenn,
SCHAWOHL Sebastian,
ZANA Rivka.
</p>
<p>IUP 2 GMI 2003-2004</p>
</div> <!-- end footer !-->

20
data/header.inc.php Normal file
View file

@ -0,0 +1,20 @@
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"DTD/xhtml1-transitional.dtd"
>
<html xmlns="http://www.w3.org/1999/xhtml"
xml:lang="fr"
lang="fr">
<head>
<title> D'Astre.Net </title>
<link rel="stylesheet" href="/styles/main.css" />
<link rel="stylesheet" href="/styles/header.css" />
<link rel="stylesheet" href="/styles/menuGauche.css" />
<link rel="stylesheet" href="/styles/columnContent.css" />
<link rel="stylesheet" href="/styles/contenu.css" />
<link rel="stylesheet" href="/styles/footer.css" />

64
data/menugauche.inc.php Normal file
View file

@ -0,0 +1,64 @@
<!-- Menu qui dépend des acces autorisés à l'utilisateur !-->
<div id="menuGauche">
<h1>Informations</h1>
<p>
<img src="/icones/users.png" alt="Icone" />
<?php
$userline= "Utilisateur: ";
if ($_SESSION["member"]){
$userline.= "<b>" . $_SESSION["member"] ."</b>"."<br />".
"<a href=\"logout.php\">D&eacute;connexion</a>";
} else {
$userline.="inconnu.";
}
print $userline;
?>
</p>
<?php
$actionMenu=new SecureMenu("Actions",0);
$actionMenu->addItem("index","Sommaire","index.php");
$actionMenu->setItemLevel("index",3);
$daMenu=new SecureMenu("Demandes d'Achats",0);
$daMenu->addItem("DAajoute","Cr&eacute;ation","DAajoute.php");
$daMenu->setItemLevel("DAajoute",1);
$daMenu->addItem("DAliste","Gestion Demandes d'achat","DAliste.php");
$daMenu->setItemLevel("DAliste",1);
$daMenu->addItem("DAstock","Gestion des stocks","DAstock.php");
$daMenu->setItemLevel("DAstock",1);
$fournMenu=new SecureMenu("Fournisseurs",0);
$fournMenu->addItem("Faddsup","Gestion fournisseurs","fournisseurs.php");
$fournMenu->setItemLevel("Faddsup",2);
$fournMenu->addItem("Paddsup","Gestion produits","produits.php");
$fournMenu->setItemLevel("Paddsup",2);
$commMenu=new SecureMenu("Commandes",0);
$commMenu->addItem("Ccreate","Cr&eacute;ation commande","commandes.php");
$commMenu->setItemLevel("Ccreate",2);
//$commMenu->addItem("Csuiv","Suivi commande","Csuivi.php");
//$commMenu->setItemLevel("Csuiv",2);
if ($_SESSION["member"] and $_SESSION["userInfo"]){
$actionMenu->setCurrentLevel($_SESSION["userInfo"]->getAccessLevel());
$daMenu->setCurrentLevel($_SESSION["userInfo"]->getAccessLevel());
$fournMenu->setCurrentLevel($_SESSION["userInfo"]->getAccessLevel());
$commMenu->setCurrentLevel($_SESSION["userInfo"]->getAccessLevel());
print $actionMenu->toHTML();
print $daMenu->toHTML();
print $fournMenu->toHTML();
print $commMenu->toHTML();
}
?>
</div>

58
doc/Makefile Normal file
View file

@ -0,0 +1,58 @@
LATEX = latex
PDFLATEX = pdflatex
PSLATEX = pslatex
DVIPDF = dvipdf
DVIPS = dvips
PS2PDF = ps2pdf
GDATE := $(shell date +"-%Y-%m-%d_r%H")
GFILENAME := CDC$(GDATE).tar.bz2
LOCALDIR = $(shell pwd)
MAINFILE = rapport
PNGFILES := $(shell ls *.png 2> /dev/null )
EPSFILES := $(patsubst %.png,%.eps,$(PNGFILES))
PNG2EPSCC = convert
TEXFILES := $(MAINFILE).tex
DVIFILES := $(MAINFILE).dvi
PDFFILES := $(MAINFILE).pdf
PSFILES := $(MAINFILE).ps
all: png2eps dvi dvi ps pdf pdf
png2eps: $(EPSFILES)
%.eps : %.png
@$(PNG2EPSCC) $< $@
@echo -e "png2eps\t$< $@"
clean:
rm -f rapport.dvi rapport.rtf rapport.pdf rapport.ps
rm -f *.out *.log *.toc *.aux
rm -f *.eps
rm -f *.tex~
pdf: $(TEXFILES)
$(PDFLATEX) $(TEXFILES)
ps: $(TEXFILES)
$(DVIPS) $(DVIFILES)
dvi: $(PRJFILES)
$(LATEX) $(TEXFILES)
#mail: package sendmail
#
#pdfmail :
# make && make
# echo "Et voila le dernier pdf" | mutt lsr-dev -a $(PDFFILES) -s "[CDC] Rev$(GDATE) (en PDF)"
#
#sendmail:
# echo "Et voila" | mutt lsr-dev -a ../Archives/$(GFILENAME) -s "[CDC] Rev$(GDATE) (en TeX)"
#
package: clean storefile
#storefile:
# tar -cjvf ../$(GFILENAME) -C ../ cdc
# mv ../$(GFILENAME) ../Archives

23
doc/acheteur.tex Normal file
View file

@ -0,0 +1,23 @@
\section{L'acheteur}
\par L'acheteur a la possibilité de gérer les founisseurs. Les acheteurs sont clasés par famille de produits. A chaque connexion apparait la famille de produit à laquelle appartient l'acheteur. Chaque acheteur a la possibilié de faire des ajouts sur les fournisseurs, mais également de gérer les produits.
\subsection{Ajout d'un fournisseur}
\par Afin d'ajouter un fournisseur, l'acheteur doit cliquer sur le lien 'Gestion fournisseur'. Plusieurs informations sur les fournisseurs sont à saisir tel que le nom, adresse, numéro de téléphone, numéro de Siret(...).
\par Par ailleurs, la liste des fournisseurs déjà existants est affichée également en bas de page.
\texima{ajoutfour}{12cm}{9cm}
\subsection{Gestion des produits}
\par La gestion des produits consistent à ajouter un produit. Pour cela, l'acheteur saisit les informations concernant le produit, c'est à dire la désignation, le tarif, ainsi que l'unité.
\par Par ailleurs, il est nécessaire de saisir la reference du fournisseur ainsi que les références internes du produit , qui peut etre soit existant, soit nouveuax. Dans le cas d'une référence déjà connu, un menu déroulant apparait, et il suffit de sélection la référence que l'on souhaite ajouter.
\par Voici comment apparaît la page .
\texima{ajoutproduit}{12cm}{9cm}
\par Comme pour le magasinier, l'acheteur a la possibilité de revenir au sommaire ou de se deconnecter grâce au menu se trouvant sur la gauche.
\subsection{Les commandes}

BIN
doc/ajoutfour.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

BIN
doc/ajoutproduit.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

28
doc/bd.tex Normal file
View file

@ -0,0 +1,28 @@
\section{Base de données}
\subsection{L'implémentation}
\par Le modèle conceptuel de données (MCD) ainsi que le schéma SQL de la base de donnée ont été généré avec le logiciel Gerwin\footnote{http://es.gnu.org/~jemarch/gerwin/}
Le MCD est disponnible au format Gerwin dans l'archive du projet : \verb+sql/MCDTrac.ger+.
\subsection{Les scripts}
\par Afin de manipuler plus facilement la base, une série de script \verb+.sql+
est présente dans le répertoire \verb+sql/+ de l'archive de D'Astre.Net.
Ces scripts permettent la création, le remplissage, ainsi que la destruction de la base.
Voici la nomenclature des scripts :
\begin{itemize}
\item {db-create-mcd.sql : génère les tables de la base à partir du MCD.}
\item {db-create-xxxx.sql : ajoute des tables spéciales hors-mcd.}
\item {db-fill-xxxx.sql : (ou xxxx est le nom de la table), permet de remplir la table avec des données de test.}
\item {db-drop.sql : permet de supprimer dans l'ordre les tables.}
\end{itemize}
\par Pour plus de commodité, l'installation et la suppression de la base ont été simplifiés avec les scripts \verb+install.php+ et\verb+drop.php+ qui appellent les scripts \verb+.sql+ précédents dans le bon ordre.
\subsection{Connexion à la base de données}
\par La connexion à la base de donnée aurait pu être gérée au niveau de la page,
mais pour plus de commodité au niveau de la conception cela n'a pas été le cas.
Cependant, la configuration de la base pour y accéder à partir de PHP a tout de
même été centralisée dans le fichier \verb+config/db.conf.php+.

10
doc/conclusion.tex Normal file
View file

@ -0,0 +1,10 @@
\par Finalement,le casdast a permis résoudre un cas concret. Nous avons pu constater l'evolution et les differents étapes d'un projet.
\section{Difficultés rencontrés}
\section {Avenir}

16
doc/couv.tex Normal file
View file

@ -0,0 +1,16 @@
\title{Rapport du projet de Génie Logiciel : D'Astre.Net\\ \today}
\date{}
\author{\vspace{1cm} \\ {\sc Cours de Génie Logiciel} \\
de Antoine Canet. \\~\\
{\sc Université Paris 7 - Denis Diderot.}
\\ \vspace{3cm} \\
\begin{tabular}{ r l l }
par & Roland LAURES & {\em $<$shamox77@mac.com$>$},\\
& Glenn ROLLAND & {\em $<$glenux@fr.st$>$}, \\
& Sebastian SCHAWOHL & {\em $<$stormrider@nerim.fr$>$}, \\
& Rivka ZANA & {\em $<$rivka\_zan@hotmail.com$>$}
\end{tabular}
}
%\date{\today}
%\title{Janat}
\maketitle

BIN
doc/creationDA.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

31
doc/creationDA.tex Normal file
View file

@ -0,0 +1,31 @@
\subsection{Création des demandes d'achat}
\par La page de création des demandes d'achat est composé de deux parties :
\itemize{begin}
\item{Livraison} : permettant de déterminer les horaires de préférences aux
quelles vous voulez être livré
\item{Ajout d'un nouveau produit} : permettant d'ajouter un produit à la
demande d'achat que vous allez créer.
\itemize{end}
\subsubsection{Livraison}
\par L'utilisation est assez simple, il vous suffit d'indiquer dans chacun
des champs correspondants, la date (au format jour / mois / année (4 chiffres))
et l'horaire.
\subsubsection{Ajout d'un nouveau produit}
\par Dans cette partie, au début vous n'avez de présent que 2 menus déroulants et un champ.
les deux menus correspondent en partant de la gauche au choix de selection de la famille de
produit à laquelle le produit que vous voulez ajouter appartient, puis la référence
interne et la description interne du produit que vous désirer demander. Il ne vous
plus qu'à remplir le champ quantité et à valider votre ligne d'achat en cliquant
sur le bouton Ajouter juste en dessous, et vous aurez créé une ligne de votre demande
d'achat. Réitérer la manoeuvre afin de finir votre demande d'achat en y introduisant
plusieurs lignes d'achats (une seule reste possible).
\par Lorsque vous avez ajouter une ligne d'achat à votre demande d'achat, une sous-partie
apparraît où la liste des lignes de demandes d'achat que vous aurez rentré apparaitra.
Chaque ligne de cette liste est précédée d'une petite case qui vous permettra de selectionner
la ligne d'achat correspondant, et de la supprimer en cliquant (une fois qu'elle est selectionnée)
sur le bouton Supprimer se situant en dessous de la liste des lignes de demandes d'achats.
\par Une fois que vous avez fini de remplir votre demande d'achat avec vos lignes, cliquer sur le
bouton "Valider" se situant en bas au milieu afin de valider votre demande d'achat. Elle sera alors
prise en compte par le système.

264
doc/demandeAchat.tex Normal file
View file

@ -0,0 +1,264 @@
\section{Demande d'achat}
\par Les demande d'achats sont gérées grâce à l'utilisation
des classes {\em LDachat} (\verb+/includes/libLDachat.inc.php+ et {\em ListeDA} \verb+/includes/liblisteDA.inc.php+) que nous détaillerons par la suite .
Pour ne pas perdre les informations de page en page lors de la création de la
Demande d'achat, la variable de session \verb+$_SESSION["demandeAchat]"+ contient l'objet {\em DemandeAchat} correspondant à la demande en cours de création.
\par Enfin, la classe {\em DemandeAchat} est composée d'une liste de {\em LDachat}, qui correspondent aux lignes de demande d'achat.
\subsection{Classe LDachat}
\par Comme dit précedemment, cette classe représente
une ligne d'achat. Elle est créée lorsque le magasinier
a choisi {\it ``Ajouter"} sur la page de création de demande d'achat.
\lstset{language=PHP}
\begin{lstlisting}
class LDachat {
function LDachat($fam, $prod, $qte,$da_id=-1);
}
\end{lstlisting}
\par Cette classe se compose uniquement de quelques champs représentant la famille de produits du produit
selectionné, la référence interne du produit, la quantité souhaitée et finalement le numéro de demande d'achat
rattaché. Tous ces champs sont initialisés grâce au constructeur.
\subsection{Classe DemandeAchat}
\par Cette classe permet d'avoir un objet qui contient toutes les informations utiles pour pouvoir créer des demandes d'achats. Voici son prototype:
\lstset{language=PHP}
\begin{lstlisting}
class DemandeAchat {
function DemandeAchat($id_mag);
function load($id_da);
function ajouteLDA($famProd,$prodSelect,
$quantiteDem,$prodUnit="kg");
function supprimeLDA($Cases_supp);
function toHTML($editable=0);
function insereBD();
}
\end{lstlisting}
\subsubsection{Le constructeur}
\par Le constructeur doit :
\begin{itemize}
\item{initialiser le champ correspondant à l'identifiant du magasinier qui passe commande}
\item{créer un tableau vide, qui par la suite contiendra des lignes de demande d'achat}
\item{initialiser le champ qui correspond aux nombres de lignes d'achat}
\end{itemize}
\subsubsection{Charger les lignes de demandes d'achat}
\par La fonction \verb+function load($id_da)+ permet de
remplir l'objet {\em DemandeAchat} en faisant une requête
sur la base de données
avec le numéro de demande d'achat souhaité.
\subsubsection{Ajouter ou supprimer des lignes d'achats}
\par Les fonctions \verb+ajouteLDA(...)+
et \verb+supprimeLDA($Cases_supp)+, permettent respectivement d'ajouter et de supprimer des lignes de la {\em DemandeAchat}.
\lstset{language=PHP}
\begin{lstlisting}
function ajouteLDA($famProd,$prodSelect,
$quantiteDem,$prodUnit="kg"){
$lda = new LDachat($famProd, $prodSelect,
$quantiteDem);
$this->_ligneAchat[$this->_ligneIdx]=&$lda;
$this->_ligneIdx++;
}
\end{lstlisting}
\lstset{language=PHP}
\begin{lstlisting}
function supprimeLDA($Cases_supp){
// on cherche les lignes selectionnees
// pour la suppression
if (is_array($Cases_supp)){
while( list($case,$val) = each($Cases_supp) ){
// on supprime les lignes selectionnees
$idx=preg_replace("/Check_/","",$val);
unset($this->_ligneAchat[$idx]);
}
[...]
}
}
\end{lstlisting}
\par Ces deux fonctions n'ont aucune incidence sur la base de donnée,
mais uniquement sur l'affichage et le contenu de l'objet {\em DemandeAchat}
courant.
En effet, lorsqu'un magasinier ``ajoute" un produit (il fait un clic sur
``Ajouter" sur la page \verb+DAajoute.php+), cela lui affiche une nouvelle
ligne d'achat dans le contenu de la demande d'achat, mais rien n'est modifié
dans la base tant qu'il ne clique pas sur "Valider".
Ainsi l'utilisateur peut commettre des erreurs, puis les corriger (suppression des lignes), sans laisser dans la base des lignes d'achat qui auraient malencontreusement prise en compte par des Acheteurs entrain de travailler...
\subsubsection{Affichage à l'écran}
\par Pour afficher une demande d'achat on utilise la fonction \verb+toHTML($editable=0)+. Le paramètre sert
uniquement pour différencier deux cas :
\begin{itemize}
\item{\$editable=0} Dans ce cas on affiche les lignes d'achats contenues dans la demande d'achat.
\item{\$editable=1} Dans ce cas précis, on affiche les lignes d'acahts avec une ``checkbox" devant, qui
servira pour une sélection (dans le cas où on voudrai pouvoir la supprimer)
\end{itemize}
\subsubsection{Insertion dans la base de données}
\par Pour insérer une demande d'achat, il suffit de faire appel à la fonction \verb+insereBD()+. Celle-ci, insère
la demande d'achat, avec toutes ses lignes d'achats dans les tables correspondantes (en faisant attention d'avoir
les bons identifiants).
\subsection{Autres fonctions pour les demandes d'achats}
\par Dans le fichier \verb+/includes/libLDachat.inc.php+, il n'y pas que les classes {\em LDachat} et
{\em DemandeAchat}, mais aussi d'autres fonctions utiles à la bonne mise en place des demandes d'achats.
\subsubsection{Les menus déroulants}
\par Il y a deux fonctions qui créent des menus déroulants :
\begin{description}
\item{\verb+menu_deroulant_Produits($ref_int,$designation)+} Celle-ci concatène les deux chaînes de caractères
(référence interne et désignation du produit) passées en arguments et en crée une ``option" pour un menu déroulant.
\lstset{language=PHP}
\begin{lstlisting}
function menu_deroulant_Produits
($ref_int, $designation) {
$ref_des = "".$ref_int." : "
.$designation;
echo "<option value=\"$ref_int\">
$ref_des</option>";
}
\end{lstlisting}
\item{\verb+menu_deroulant_familleProd ($famille)+} Celle-ci genère une ``option", contenant le nom d'une famille
de produits, pour un menu déroulant.
\lstset{language=PHP}
\begin{lstlisting}
function menu_deroulant_familleProd
($famille) {
echo "<option value=\"$famille\">
$famille</option>";
}
\end{lstlisting}
\end{description}
\subsubsection{Requêtes}
\par Deux fonctions interagissent avec la base de données :
\begin{description}
\item{\verb+donne_familles()+} Cette fonction retourne un tableau contenant tous les noms de familles de produits.
\item{\verb+trouve_produits($ref_famille)+} Cette fonction retourne un tableau contenant la référence interne d'un
produit, ainsi que sa désignation, appartenant à la famille de produits passée en argument.
\end{description}
\subsubsection{Conversion de PHP vers Javascript}
\par Le fichier \verb+/includes/scriptJS_DA.inc.php+ contient un script Javascript qui permet de mettre à jour
un menu déroulant en fonction du choix fait dans un autre menu déroulant. Or ces menus déroulants, contienent des
informations stockées dans la base de données. C'est pourquoi, on appelle les fonctions \verb+donne_familles()+
et \verb+trouve_produits(...)+, dont on convertit le résultat en Javascript via la fonction \verb+convertToJS($var)+.
\par Voici le script Javascript qui illustre l'utilisation de cette fonction.
\lstset{language=PHP}
\begin{lstlisting}
function changeFam_Prod(famille, listeProduits) {
[...]
make=famille.options[famille.selectedIndex].text;
liste = new Array;
i=0;
<?php
$familles = donne_familles();
$famillesJS = convertToJS($familles);
?>
familles = new Array<?php echo $famillesJS; ?>;
<?php
for($fam=0;$fam<sizeof($familles);$fam++) {
print "if (make == familles[$fam]) { ";
// cherche les produits de la famille numero f
$prods = trouve_produits($fam+1);
$js = convertToJS($prods);
print "produits = new Array".$js.";";
print "for(j=0; j<produits.length; j=j+2) { "
."ref_design = produits[j] + \" : \"
+ produits[j+1]; "
."liste[i++]=new Option(ref_design,
produits[j]); "
[...]
}
\end{lstlisting}
\subsubsection{Exemple d'application des trois points précédents}
\par Cet exemple est tiré du fichier \verb+DAajoute.php+ et montre l'utilisation des fonctions décrites précédement.
Le code qui suit genère les deux menus déroulants permettant au magasinier de choisir un produit dans une famille de
produit. Lorsque le magasinier choisi une famille de produit, le menu déroulant correspondant aux produits se met
automatiquement à jour (sans devoir recharger la page) pour montrer les produits appartenant à la nouvelle famille de produits selectionnée.
\lstset{language=PHP}
\begin{lstlisting}
<select name="famille"
onChange="changeFam_Prod(this.form.famille,
this.form.produit);" >
<?php
for($i=0;$i<count($familles);$i++) {
menu_deroulant_familleProd($familles[$i]);
}
?>
</select>
<select name="produit">
<?php
$prod = trouve_produits(1);
for($i=0;$i<sizeof($prod);$i=$i+2) {
menu_deroulant_Produits($prod[$i], $prod[$i+1]);
}
?>
</select>
\end{lstlisting}
\subsection{Classe ListeDA}
\par Les sources de cette classe sont dans le fichier \verb+/includes/liblisteDA.inc.php+. Cette classe sert à
avoir une liste de demandes d'achats, utile pour la page \verb+DAliste.php+, car dans cette page on est amené à
afficher toutes les demandes d'achats dont les lignes d'achat ont un certain état (\verb+'CREE'+ par exemple).
\lstset{language=PHP}
\begin{lstlisting}
class ListeDA {
function ListeDA($libelle,$id_mag);
function ajouteDA(\$da);
function supprimeDA(\$Cases_supp);
function loadListe();
function toHTML();
}
\end{lstlisting}
\subsubsection{Le constructeur}
\par Le constructeur initialise les champs de l'objet : nombre de demande d'achats contenues dans le tableau,
création du tableau, l'identifiant du magasinier et le libellé de l'état des lignes d'achats voulues.
\subsubsection{Ajout et suppression à différentes échelles}
\par Pour ce qui est de l'ajout, fonction \verb+ajouteLDA($da)+, on ajoute la demande d'achat passée en paramètre, au
tableau qui contient toutes les demandes d'acahts, sans oublier d'incrémenter le nombre de demandes d'achats contenues.
\par Quand à la suppression, fonction \verb+supprimeDA(...)+, on regarde les demandes d'achats à supprimer
(tableau passé en argument) et ensuite on fait des suppressions succesives dans la base de données. On commence par
supprimer dans la table \verb+Etats_LA+, puis \verb+Ligne_d_achat+ et enfin \verb+Demande_d_achat+.
\subsubsection{Chargement d'une liste de demande d'achats}
\par La fonction \verb+loadListe()+, fait une requête pour trouver toutes les demandes d'achats corespondant au
champ libellé de l'objet. Pour chaque résultat trouvé, on crée une nouvelle demande d'achat qu'on insère dans la
liste des demandes d'achats. Cette fonction sert à ``initialiser" la liste des demandes d'achats de l'objet.
\subsubsection{Affichage}
\par L'affichage d'un objet se fait par sa fonction \verb+toHTML()+.

16
doc/gestionDA.tex Normal file
View file

@ -0,0 +1,16 @@
\subsection{Gestion Demandes d'achat}
\par Il y a deux grandes parties sur cette page :
\itemize{begin}
\item{Demandes d'achats non traitées} : représentant la liste des demandes d'achats qui n'ont pas encore
été traitéen tout ou en partie par un acheteur.
\item{Demandes d'achat en cours de traitement} : représentant la liste des demandes d'achats qui ont
subit au moins un début de traitement (si au moins une des lignes d'achats à fait l'objet d'une commande).
\itemize{end}
\subsubsection{Demandes d'achats non traitées}
\par Dans cette parties, vous pouvez voir ou supprimer une demande d'achat que vous avez faites. Pour la
supprimer, il vous suffit de cocher la case à gauche du nom et numéros de votre demande d'achat, puis de
cliquer sur le bouton Supprimer situer en bas de la partie des demandes d'achats non traitées.
\subsubsection{Demandes d'achat en cours de traitement}

10
doc/gestionDesStocks.tex Normal file
View file

@ -0,0 +1,10 @@
\subsection{Gestion des stocks}
\par Cette page sert à gérer la quantité de produit présent dans les stocks, les seuils minimum
et maximum correspondant à un produit.
\par Pour l'utiliser, il suffit de selectionner la famille de produit à laquelle le produit
appartient dans le premier menu déroulant (en haut à gauche), de selectionner dans le menu
déroulant juste à droite du premier le produit et enfin de cliquer sur le bouton Modifier.
\par Il apparaît alors un petit formulaire avec des champs représentant le stock actuel,
le seuil minimum et le seuil maximum. Mettez les valeurs que vous vouliez mettre et appuyez
sur le bouton Accepter en dessous du formulaire. Si vous voulez annuler cliquer sur le bouton
Annuler en haut à coté du bouton Modifier, et cliquez sur Accepter.

View file

@ -0,0 +1,22 @@
\subsection{Gestion des Fournisseur}
\par Sur cette page, deux parties sont distingables :
\itemize{begin}
\item{Ajout de fournisseurs}
\item{Liste des fournisseurs existants}
\itemize{end}
\subsubsection{Ajout de fournisseurs}
\par Cette partie est composée des champs necessaires pour l'enregistrement d'un nouveau
fournisseur. À gauche de chaque champ, une étiquette permet d'identifier l'information à
laquelle il correspond. Une fois tous les champs rempli, validé l'ajout du fournisseur en
cliquant sur le bouton "Ajouter" à gauche du bouton Annuler dans cette même partie.
\subsubsection{Liste des fournisseurs existants}
\par Cette petite partie est composée d'une liste de fournisseur, qui est la liste des
fournisseurs connus par le système. Une fois ajouter, un fournisseur n'est pas éternellement
enregistré et indélogeable du système, et peut être retirer. Pour en retirer un, cliquez
simplement sur la case se trouvant sur la même ligne que la petite description du fournisseur
que vous souaitez supprimer de votre liste. Vous pouvez en selectionner plusieurs afin d'en
supprimer plusieurs dans une même opération. Une fois que vous êtes sûr de votre selection,
cliquez sur le bouton Supprimer juste en bas de la liste des fournisseurs. Les fournisseurs
des lignes cochés se trouveront supprimés de votre liste.

35
doc/gestionproduit.tex Normal file
View file

@ -0,0 +1,35 @@
\subsection{Gestion de Produits}
\par Sur cette page, il y a 2 grosses parties :
\itemize{begin}
\item{Ajout de produits}
\item{Liste des produits}
\itemize{end}
\subsubsection{Ajout de Produits}
\par Cette partie est composée de deux sous-parties :
\itemize{begin}
\item{Informations sur le produit} : Ici, on selectionne d'abord le fournisseur à l'aide du menu
déroulant, puis on entre la désignation du produit, puis le prix en fonction de l'unité, selectionnable
par l'intermédiare du menu déroulant.
\item{Références} : Dans cette sous-partie, on entre les références du produit à ajouter. Le premier
champ correspond à la référence utilisée par le fournisseur. Puis il faut choisir la référence interne
au Cas D'Astre. Si la référence existe déjà, cliquer sur le bouton à gauche du texte "Existante :" et
choisissez dans le menu déroulant, la référence correspondante. Si la référence n'existe pas, cliquez
sur le bouton à gauche du mot "Nouvelle", et entrez la référence interne dans le champ désigné comme
étant référence (en dessous du texte "Nouvelle") et entrez la description dans le champ "Description"
situé en dessous du dernier.
\itemize{end}
\par Afin d'ajouter correctement un nouveau produit faites bien attention à bien remplir tous les champs
nécessaires des deux sous-parties.
\subsubsection{Listes des Produits}
\par Dans cette partie, une liste est visible composer des produits référencés dans le système
comme étant aux catalogue des fournisseurs de la catégorie à laquelle vous êtes associé (Aciers
et fontes, chimie, ...). Chaque ligne est constituée d'une case à cocher, le numéro interne de
produit, la description du produit, l'identifiant du fournisseur proposant ce produit, et la
référence du produit au sein de cette société.
\par Cette liste sert essentiellement à pouvoir supprimer la référence d'un produit (s'il n'est
plus au catalogue du fournisseur par exemple) du système. Pour le faire, il suffit de cocher la
case devant la ligne du/des produit(s) que l'on veut supprimer, et d'appuyer quand on en est sûr
sur le bouton Supprimer qui se trouve tout en bas de la liste.

180
doc/installation.tex Normal file
View file

@ -0,0 +1,180 @@
\section{Pré-requis}
\subsection{Machine serveur}
D'Astre.Net nécessite, pour fonctionner :
\begin{itemize}
\item{un serveur web,}
\item{un interpréteur PHP 4.2,}
\item{un serveur de base de donnée relationnelle compatible SQL,}
\item{une connexion réseau permettant au serveur de communiquer avec
les machines clientes.}
\end{itemize}
\subsection{Machines clientes}
\par Au niveau utilisateur, il est nécessaire d'avoir:
\begin{itemize}
\item{une connexion réseau permettant de contacter le serveur hébergeant
D'Astre.Net}
\item{un navigateur web supportant pleinement les normes du W3C:
XHTML 1.0 et CSS 2, ainsi que le langage JavaScript normalisé ECMA.}
\end{itemize}~
\par Nous conseillons l'utilisation d'un navigateur tel que
Mozilla 1.5\footnote{\url{http://www.frenchmozilla.org}},
Mozilla-FireFox 0.7\footnote{\url{http://www.frenchmozilla.org}},
Opera 6\footnote{\url{http://www.opera.com}},
Safari 1.1\footnote{\url{http://www.apple.com/fr/}} ou versions supérieures.
\par Microsoft Internet Explorer 6 ne supportant complètement ni CSS 1,
ni CSS 2 nous ne pouvons garantir avec ce logiciel une parfaite navigation
sur les pages de D'Astre.Net.
\section{Déploiement du logiciel}
\subsection{Téléchargement}
\par Vous pouvez vous procurer D'Astre.Net via
%TODO: (compléter)
ou le télécharger sur le CVS :
%TODO: (compléter)
\subsection{Décompression du package}
\par Une fois l'archive de D'Astre.Net récupérée,
il vous faudra
choisir un répertoire d'installation (désigné
par "\verb+/le/repertoire/d_installation+"
ici), faire en sorte qu'il soit accessible en lecture,
et y mettre le contenu de l'archive.
\par Dans votre terminal, tapez :
\lstset{language=csh}
\begin{lstlisting}
$ mkdir /le/repertoire/d_installation
$ chmod 755 /le/repertoire/d_installation
$ tar -xzvf archive.tar.gz
$ mv dastrenet/* /le/repertoire/d_installation
\end{lstlisting}
\subsection{Mise en place de la base de donnée}
\subsubsection{Création de la base}
\par Dans une console, connectez vous en tant qu'administrateur
sur la base donnée :
\lstset{language=csh}
\begin{lstlisting}
$ cd /le/repertoire/d_installation
$ mysql -u root -p
Enter password: (password)
[...]
mysql>
\end{lstlisting}
Ajoutez une nouvelle base nommée (nommée ici "\verb+dastre_base+")
à votre base de donnée :
\lstset{language=SQL,morekeywords={DATABASE}}
\begin{lstlisting}
mysql> CREATE DATABASE dastre_base;
Query OK, 1 row affected (0.07 sec)
\end{lstlisting}
\subsubsection{Création de l'utilisateur}
\par Vous devez ensuite choisir un nouveau nom d'utilisateur
(et le mot de passe associé) qui serviront à accéder à la base
de D'Astre.Net.
On choisira pour la suite \verb+dastre_username+ pour représenter
l'identifiant de l'utilisateur et \verb+dastre_userpass+ pour son mot
de passe.
\par Dans le shell de votre base de données (ouvert en tant qu'administrateur), tapez :
\lstset{language=SQL,%
morekeywords={DATABASE,DELETE,FLUSH,GRANT,UPDATE,TO,IDENTIFIED}%
}
\begin{lstlisting}
mysql> GRANT SELECT,INSERT,UPDATE,
-> DELETE,CREATE,ALTER,DROP
-> ON dastre_base.*
-> TO dastre_username@'serveur.domaine'
-> IDENTIFIED BY 'userpass';
Query OK, 0 rows affected (1.16 sec)
mysql> FLUSH privileges;
Query OK, 0 rows affected (0.36)
\end{lstlisting}
\subsection{Configuration du serveur web}
\par Ensuite, il convient de configurer le serveur
web afin qu'il permette l'accès au logiciel sur le serveur \verb+serveur.domaine+,
via un nom DNS simple, par exemple \verb+dastre_url.serveur.domaine+.
Il faut pour cela, ajouter (ou modifier) un \verb+VirtualHost+ dans
la configuration du serveur web.
\par Par exemple, pour un serveur Apache, on ajoutera les lignes
suivantes au fichier \verb+/etc/apache/httpd.conf+ (ou \verb+/etc/httpd/httpd.conf+).
\lstset{language=HTTPD}
\begin{lstlisting}
<VirtualHost dastre_url.serveur.domaine>
DocumentRoot /le/repertoire/d_installation
ServerName dastre_url.serveur.domaine
</VirtualHost>
\end{lstlisting}
\subsection{Configuration du logiciel}
Dans l'arborescence de D'Astre.Net, éditer le fichier
\verb+/config/db.conf.php+ qui fixe la configuration
du logiciel, et ajoutez ou remplacer-y les valeurs suivantes :
\begin{itemize}
\item{ le nom du serveur \verb+SQL_SERVER+, }
\item{ le nom de la base de données \verb+SQL_BASE+,}
\item{ le nom de l'utilisateur \verb+SQL_USER+, }
\item{ le mot de passe de l'utilisateur \verb+SQL_PASSWD+. }
\end{itemize}
\par \lstset{language=PHP}
\begin{lstlisting}
define(SQL_SERVER,"serveur.domaine");
define(SQL_BASE,"dastre_base");
define(SQL_USER,"dastre_username");
define(SQL_PASSWD,"dastre_userpass");
\end{lstlisting}
\subsection{Création des tables de la base}
\par Une fois le logiciel installé, et les divers serveurs correctement
configurés, il convient de créer les tables utiles à D'Astre.Net dans
la base \verb+dastre_base+.
Pour cela, ouvrez un navigateur web, et connectez-vous sur :
\url{http://dastre\_url.serveur.domaine/sql/install.php}.
\par Si toutes les requêtes sont executées avec succès, il ne reste plus
qu'a changer les droits d'accès au répertoire \verb+/sql+ de l'arborescence
de D'Astre.Net afin d'éviter qu'un utilisateur réinitialise la base.
\lstset{language=csh}
\begin{lstlisting}
$ cd /le/repertoire/d_installation
$ chmod 400 sql
\end{lstlisting}
\par Normalement, à ce stade, D'Astre.Net est prêt à être utilisé.
\subsection{En cas de problèmes}
Si jamais il s'est produit une erreur durant de la création
des tables, vous pouvez à tout moment effacer ces dernières
et recommencer en suivant la démarche suivante : ouvrez un
navigateur web, et connectez-vous sur :
\url{http://dastre\_url.serveur.domaine/sql/drop.php}.

62
doc/lib_generalite.tex Normal file
View file

@ -0,0 +1,62 @@
\section{Généralité sur la construction d'une page de D'Astre.Net}
\subsection{Plusieurs étapes...}
\par Toutes les pages de D'Astre.Net sont créées dynamiquement.
Leur construction se déroule selon les étapes suivantes :
\begin{itemize}
\item{initialisation de l'environnement,}
\item{chargement des librairies (définitions des classes et fonctions), }
\item{creation d'un objet \verb+Page+,}
\item{remplissage de l'objet \verb+Page+,}
\item{fermeture de l'objet \verb+Page+,}
\item{affichage de la page complete.}
\end{itemize}
\newpage
\subsection{Plusieurs morceaux...}
\par Le développement était axé sur la modularité, cela nous facilitant l'intégration
de nouveaux élements à un module, ou en modifier le fonctionnement sans perturber le reste
du projet.
\par Le projet est structuré de la façon suivante :
\begin{verbatim}
CasDAstre/
|-- README // Instructions pour la compilation du projet
|-- Makefile // Règles de compilation
|-- images/ // Images et thèmes utilisés par le programme
| `-- *.tex // Rapport en LaTeX
|-- includes/
| `-- *.inc.php // Classe utilisées par le programme
|-- config/
| `-- *.conf.php // Configuration de Janat
|-- doc/
| |-- *.tex // Rapport en LaTeX
| `-- Makefile // Regles de compilation
|-- styles/
| `-- *.css // Feuilles de styles
|-- sql/ // Scripts SQL
| |-- MCDTrac.ger // Modèle Conceptuel de Données
| |-- db-install.php // Script qui execute les requêtes SQL
| |-- db-fill*.sql // Script qui remplit les tables
| `-- db-create*.sql // Script qui créer les tables
`-- *.php // Sources du programme
\end{verbatim}
\subsection{La nomenclature pour les fichiers}
\subsubsection{Les scripts}
Les scripts appelés directement dans le navigateur se trouvent
à la racine du logiciel.
\subsubsection{Les classes et bibliothèques}
\par Les classes se trouvent dans le répertoire includes/ du logiciel.
Une classe "\verb+maclasse+" donnée se retrouvera dans le fichier
\verb+libmaclasse.inc.php"*+".
\par Les bibliotheques de fonctions utiles pour un script \verb+monscript.php+,
se retrouveront soit dans le fichier de la classe principale associée au script,
soit dans un fichier \verb+libmonscript.inc.php+.

23
doc/libfournisseur.tex Normal file
View file

@ -0,0 +1,23 @@
\section{Fournisseur}
\lstset{language=PHP}
\begin{lstlisting}
class Fournisseur{
Fournisseur($id,$nom,$adresse,
$famille, $tel,
$fax, $siret, $siren);
toHTML();
}
\end{lstlisting}
\subsection{Construteur}
Le construteur a pour rôle d'initialiser les variables qui sont récuperées en paramêtre.
\subsection{Affichage de la page}
\par La méthode \verb+toHTML()+ affiche tous les renseignements d'un fournisseur.

View file

@ -0,0 +1,40 @@
\section{Liste des fournisseurs}
\lstset{language=PHP}
\begin{lstlisting}
class ListeFournisseurs {
function ListeFournisseurs($acheteurID);
function loadList();
function setFamilleFromAcheteur($acheteurID);
function ajouteFournisseur($id,$nom, $adresse,
$famille, $tel,
$fax, $siret,
$siren);
function supprimeFournisseur($ids);
function loadList();
function toHTML($editable=0);
}
\end{lstlisting}
\par Cette classe contient toutes les fonctions utiles pour la gestion d'une liste de fournisseurs.
\subsection{Constructeur}
\par Le constructeur s'occupe de paramétrer la classe afin de ne charger que les fournisseurs connus par l'Acheteur \verb+$acheteurID+.
\par
\subsection{Lister tous les fournisseurs}
\par Afin de lister les fournisseurs, nous avons utilsé une requête pour récuperer tous les informations sur un fournisseur. Ainsi la fonction \verb+function loadList()+ permet de charger une liste à partir des éléments de la base de données. Cette fonction remplit le tableau de tous les fournisseurs.
\subsection{Ajout d'un fournisseur}
\par Pour ajouter un fournisseur dans la base de données, nous avons utilisé l'instruction \verb+INSERT+. Par ailleurs après chaque ajout la fonction \verb+loadList()+ est nécessaire pour faire une mise à jour sur la liste des fournisseurs
\subsection{Suppression d'un fournisseur}
\par Pour la suppression d'un fournisseur, nous avons utilisé la même procédure que celle de l'ajout, c'est à dire se connecter à la base de données, effectuer une requête et recharger la liste. Cependant pour la suppression d'un fournisseur nous avons utilisé l'instruction \verb+DELETE+.
\subsection{Affichage de la page}
\par L'affichage de la page se fait à l'aide la fonction \verb+toHTML()+.
En fonction de la valeur du paramêtre booléen \verb+$editable+, la méthode
affiche soit tous les fournisseurs sous la formes d'un tableau
(quand \verb+$editable=1+), soit sous la forme d'une liste de sélection (quand \verb+$editable=0+).

73
doc/libpage.tex Normal file
View file

@ -0,0 +1,73 @@
\section{Page}
Il s'agit de l'objet qui gère tous les composants de la page (en-têtes, scripts, contenu,pied-de-page) et qui gère l'autentification et qui unifie l'apparence des pages.
\lstset{language=PHP}
\begin{lstlisting}
class Page{
function logCheck($authorizedLevel=0);
function setTitle($title);
function startHeader();
function endHeader(){;
function startScript();
function endScript();
function startContent();
function endContent();
function toHTML();
}
\end{lstlisting}
\subsection{Le constructeur}
\par Le construteur de cette classe à plusieurs rôles:
\begin{itemize}
\item{ il initialise les variables}
\item{ il lance une session. En effet, chaque personne qui se connecte sur le site a une session différente.}
\item{ il vérifie si le login est correct. }
\end{itemize}
\subsection{Les vérifications des droits d'accès}
\par Il est nécessaire, sur chaque page, de vérifier l'identité de l'utilisateur, et
si nécessaire de le forcer a s'identifier correctement.
\par Pour ce faire, il faut appeller la méthode \verb+logCheck($authorizedlevel)+, où \verb+$authorizedlevel+ est le masque qui sera appliqué (fonction AND) bit-à-bit aux droits de l'utilisateur pour valider ou non l'accès à la page.
\par En général, pour utiliser \verb+logCheck+, il faut :
\lstset{language=PHP}
\begin{lstlisting}
$page=new Page(__FILE__);
$_SESSION["referer"]=basename(__FILE__);
$page->logCheck();
\end{lstlisting}
afin que l'utilisateur qui n'était pas loggué revienne automatiquement sur la page courrante après s'être identifié.
\subsection{L'affichage}
\par La fonction permettant l'affichage des pages est \verb+toHTML()+
celle-ci assemble le contenu dynamique avec les fichiers suivants, afin de créer
une page de D'Astre.Net:
\begin{itemize}
\item{ \verb+header.inc.php+ :celui le chemin d'acces au
fonction ,et insert les bibiotheque nécessaire pour le fontionnement
du site }
\item{ \verb+bodystart.inc.php+ :ce fichier comprend toutes les balises du début de script html, par exemple : <body><div>...}
\item{ \verb+footer.inc.php+ :Le pied de page.}
\item{ \verb+bodyend.inc.php+ : celui-ci contient du code PHP et HTML gérant la fermeture de l'objet page, ajoutant un pied de page et affichant la page.}
\end{itemize}
\subsection{Les buffers}
\par Pour que l'affichage des pages puisse se faire correctement d'un seul coup dans \verb+toHTML+, il est nécessaire de mettre en tampon toutes les données émises vers la sortie standard. Cela permet (entre autres) l'ajout d'en-têtes HTML à la page alors que le contenu de la page a déja été émis...
Les buffers sont utilisés a tous les niveaux : en-têtes, scripts JavaScript, contenu principal.
Le contenu du buffer devra {\em impérativement} se trouver entre l'appel des méthodes \verb+startXXX()+ et \verb+endXXX()+.
Par exemple, pour le contenu de la page :
\lstset{language=PHP}
\begin{lstlisting}
$page->startContent();
?>
voila le code PHP-HTML qui est mis en tampon
pour apparaitre a un endroit precis de la page
apres recomposition par toHTML.
<?php
$page->endContent();
\end{lstlisting}

99
doc/libsecuremenu.tex Normal file
View file

@ -0,0 +1,99 @@
\section{SecureMenu }
\par Cette classe permet la création d'un menu dont les
élements ({\em items}) ne seront affichés qu'aux utilisateurs
ayant les droits d'accès suffisants pour y accéder.
\subsection{Création d'un menu}
Pour créer un menu, il suffit de créer un objet en appelant \verb+SecureMenu($level=0)+, où \verb+$level+ est le niveau d'accès nécessaire pour les futurs élements du menus si les droits d'accès ne leurs sont pas explicitement fixés.
Si \verb+$level+ n'est pas spécifié, alors les élements seront accessibles à tous par défaut.
\par Pour créer un menu il suffit donc de :
\lstset{language=PHP}
\begin{lstlisting}
$exempleMenu1=new SecureMenu();
$exempleMenu2=new SecureMenu();
\end{lstlisting}
\subsection{Ajouter des élements}
\par Pour l'ajout d'un élements, on fait appel à la fonction
\verb+addItem($identifiant,$titre,$page)+, où \verb+$identifiant+
est l'identifiant interne de l'élément du menu, \verb+$titre+ est
le titre de l'élément, tel qu'il apparaîtra aux utilisateurs du menu,
\verb+$page+ est la page cible affichée lors d'un clic sur l'élément
du menu.
\par Par exemple:
\lstset{language=PHP}
\begin{lstlisting}
$exempleMenu1->addItem("id_interne_sommaire",
"Sommaire",
"index.php");
$exempleMenu1->addItem("id_interne2",
"Definitions"
"lexique.php");
\end{lstlisting}
aura pour effet d'ajouter {\em "Sommaire"}\/ et {\em "Definitions"}\/ au menu, qui pointent
respectivement sur les pages "\verb+index.php+" et "\verb+lexique.php+"
\subsection{Gestion des droits}
\par Par définition, une application utilisable par des utilisateurs n'ayant
pas le droit aux mêmes actions, doit explicitement {\em restreindre} certaines
zones à certaines personnes.
\par Pour ce faire, il est nécessaire d'indiquer quels "les droits d'accès"
autorisés aux zones restreintes, et indiquer a ces zones le droit d'accès de
l'utilisateur actuel.
\subsubsection{Fixer les droits sur un élément}
\par Pour fixer un droit d'accès (qui régira son affichage en fonction de l'utilisateur)
à un élement du menu, il suffit d'utiliser la méthode \verb+setItemLevel($identifiant,$level)+. Dans le prototype de cette fonction, \verb+$identifiant+ indique l'identifiant de
l'élément du menu (comme vu dans \verb+addItem(...)+) et \verb+$level+ est le "droit
d'accès minimum autorisé".
\subsubsection{Indiquer au menu les droits actuels}
\par Afin que le menu soit utilisable, il est nécessaire d'indiquer au menu les
droits de l'utilisateur courant par la méthode \verb+setCurrentLevel($level)+, où
\verb+$level+ est le "droit d'accès" de l'utilisateur courrant.
Par exemple :
\lstset{language=PHP}
\begin{lstlisting}
$menu=new SecureMenu(0);
$menu->addItem("sommaire ",
"Sommaire",
"index.php");
$menu->setItemLevel("sommaire",
0);
$menu->addItem("page_invisible",
"Acces Membres"
"membres.php");
$menu->setItemLevel("page_invisible",
1);
$menu->setCurrentLevel(0);
\end{lstlisting}
aura pour effet de créer un menu dont seul l'élément {\em "Sommaire"}
sera affiché, car le droit d'accès de l'utilisateur indiqué est
insuffisant pour afficher l'entrée {\em "Acces Membres"} du menu.
\subsection{Utiliser le menu}
\par Une fois que les éléments ont été ajoutés et les droits d'accès fixés, le menu
est prêt a être utilisé : il suffit d'appeller la méthode \verb+toHTML()+ qui génère
et renvoie le code HTML correspondant au menu à l'endroit où la fonction est appelée.
\lstset{language=PHP}
\begin{lstlisting}
$menu=new SecureMenu();
[...]
print $menu->toHTML();
\end{lstlisting}

64
doc/libuserinfo.tex Normal file
View file

@ -0,0 +1,64 @@
\section{UserInfo}
\par Cette classe permet de faire une distinction pour les differents utilisateurs.
Il est construit dans le fichier \verb+logcheck.php+ afin de permettre aux autres
pages de récupérer les informations sur l'utilisateur.
\lstset{language=PHP}
\begin{lstlisting}
function UserInfo($login,
$accesslevel,
$category,
$catid);
function getFirstName();
function getSecondName();
function getID();
function getAccessLevel();
}
\end{lstlisting}
\par {\'E}tant donné que les informations sur les utilisateurs
peuvent provenir de deux tables différentes, il eut été pénible
d'écrire systématiquement dans le code la récupération des bonnes
données. La classe UserInfo sert aussi à éviter cela, et a pour effet
d'alléger le code.
\lstset{language=PHP}
\begin{lstlisting}
[...]
$switch($ category){
case LIBUSERINFO_CAT_ACHETEUR:
$query="SELECT * FROM Acheteur "
."WHERE ID_ACHETEUR='$catid' "
."ORDER BY ID_ACHETEUR DESC LIMIT 0,1";
break;
case LIBUSERINFO_CAT_MAGASINIER:
$query="SELECT * FROM Magasinier "
."WHERE ID_MAGASINIER='$catid' "
."ORDER BY ID_MAGASINIER DESC LIMIT 0,1";
break;
default: break;
[...];
}
\end{lstlisting}
\subsection{Autres informations}
Nous avons eu besoin de pouvoir recuperer les informations sur l'utilisateur de CasDAstres. C'est pourquoi certaines fonctions ont ete creer.
\subsubsection{Recupere le nom}
\verb+getFirstName+ Renseignement sur le nom de l'utisateur. En effet lors de la connection d'una acheteur ou d'un magazinier, le nom de la personne qui se connecte est récuperer a l'aide de cette fonction.
\subsubsection{Recupere le Prenom}
\verb+getSecondName+ Renseignement sur le prenom de l'utisateur.
\subsubsection{Recupere l'identifiant}
\verb+getID+ Renseignement sur l'identifiant de l'utisateur. L'identifiant est une chaine de caractere.

38
doc/magasinier.tex Normal file
View file

@ -0,0 +1,38 @@
\section{Magasinier}
\par Lors de la connexion du magasinier, deux parties apparaissent:
\begin{itemize}
\item{La page centrale qui explique toutes les actions qu'il peut faire.}
\item{Le sommaire lui permettant de passer d'une page à une autre.}
\end {itemize}
\texima{magazinier}{12cm}{9cm}
\par Le magazinier a la possibilité de:
\begin{itemize}
\item{Créer une demande d'achat}
\item{Gerer les demande D'achat}
\item{Gerer les stoks}
\end{itemize}
Il peut a tous moments revenir a la page principale en cliquant sur le lien sommaire ou peut également se déconnecter grace au lien 'Déconnexion'.
\subsection{Création d'une demande d'achat}
\subsubsection{Saisir une demande d'achat}
\par Apres avoir cliquer sur le lien Creation, l'utilisateur voit apparaitre cette page.
\texima{creationDA}{12cm}{9cm}
\par Pour la création d'une demande d'achat, il s'uffit de saisir la plage d'horaire de livraison ainsi que la date à laquelle on souhaiterai être livré.
\par Evidement l'utilisateur doit sélection le produit en fonction de sa demande. Par ailleurs, pour chaque produit l'utilisateur doit lui affecter une quantité. Apres chaque ajout, une ligne est ajouté dans le tableaux qui suit. Ainsi, il est possible de supprimer un produit déjà ajouter à l'aide du bouton Supprimer.
\subsubsection{Valider sa demande}
Apres avoir appuyer sur la touche 'Valider', apparait alors l'historique des demandes d'achat qui sont soit en cours de traitements soit non traités. Le magazinier peut ainsi supprimer les demandes qui ne sont pas encore traités.
\par Mais peut-on visualiser cette page sans effectuer une création d'une demande d'achat.?Oui, en effet, en cliquant sur le lien 'Gestion Demande d'achat'.
\subsection{Gestion d'une demande d'achat}
\par La gestion des demandes d'achat corespond a la page après avoir valider une demadne d'achar.Comme expliquer plus haut , il est possible de supprimer les demandes d'achat non traités. cette page affiche tous les produit concernant chaque demande achat.
\subsection{Gestion des stocks}

BIN
doc/magazinier.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

157
doc/rapport.tex Normal file
View file

@ -0,0 +1,157 @@
\documentclass[12pt,a4paper]{report}
\usepackage{a4wide}
\usepackage{geometry}
\usepackage{typehtml}
\usepackage[latin1]{inputenc}
\usepackage{listings}
\usepackage{color}
%% définition des couleurs
\definecolor{hellgelb}{rgb}{1,1,0.8}
%% définition des langages
\lstdefinelanguage{PHP}{
morekeywords={and,array,break,case,continue,default,define,do,%
echo,else,elseif,exit,extends,for,global,if,include,includeonce,%
or,print,require,requireonce,return,static,switch,then,var,while,%
xor,foreach,as,class,function,new,extends},
sensitive,%
morecomment=[l]\#,%
morecomment=[l]//,%
morecomment=[s]{/}{/},%
morestring=[b],%
morestring=[b]%
}[keywords,comments,strings]
\lstdefinelanguage{HTTPD}{
morekeywords={VirtualHost,DocumentRoot,ServerName},%
sensitive%
}[keywords,comments,strings]
\lstset{basicstyle=\small,%
xleftmargin=2cm,%
xrightmargin=2cm,%
framextopmargin=.2cm,%
framexbottommargin=.2cm,%
framexleftmargin=.2cm,%
framexrightmargin=.2cm,%
backgroundcolor=\color{hellgelb},%
frame=trbl
}
\lstdefinestyle{numbers}{numbers=left,stepnumber=10,numberstyle=\tiny,numbersep=10pt}
\usepackage[french]{babel}
\usepackage{fancyheadings}
\usepackage{color}
\usepackage{float}
\usepackage[cyr]{aeguill} % Police vectorielle TrueType, guillemets français
%\DeclareGraphicsExtensions{.jpg,.mps,.pdf,.png} % Formats d'images
\pagestyle{fancy}
\lhead[\sc{D'Astre.Net : gestion des achats}]{\sc{D'Astre.Net : gestion des achats}}
\rhead[\it{Projet de Génie Logiciel.}]{\it{Projet de Génie Logiciel.}}
%---------------------------------------------------------------
\newif\ifpdf
\ifx\pdfoutput\undefined
\pdffalse
\else
\pdfoutput=1
\pdftrue
\fi
\ifpdf
% ! The next three lines should be one !
\usepackage[pdftex,colorlinks=true,urlcolor=blue,pdfstartview=FitH]{hyperref}
\pdfcompresslevel=9
\hypersetup{
pdftitle={RAPPORT DU PROJET DE POO ET BD},
pdfauthor={ROLLAND Glenn, GRIN Thomas, ZANA Rivka},
pdfsubject={JANAT},
pdfkeywords={PROJET}
pdfcreator={GleNuX}
}
\usepackage[pdftex]{thumbpdf} % Vignettes
%\usepackage[pdftex, %
% bookmarks = true,% % Signets
% bookmarksnumbered = true,% % Signets numérotés
% pdfpagemode = None,% % Signets/vignettes fermé à l'ouverture
% pdfstartview = FitH,% % La page prend toute la largeur
% pdfpagelayout = SinglePage,% Vue par page
% colorlinks = true,% % Liens en couleur
% urlcolor = magenta,% % Couleur des liens externes
% pdfborder = {0 0 0}% % Style de bordure : ici, pas de bordure
% ]{hyperref} % Utilisation de HyperTeX
\usepackage[pdftex]{graphicx}
% \usepackage[pdftex]{thumbpdf}
\else
\usepackage[dvips]{epsfig}
\usepackage{hyperref}
\usepackage[T1]{fontenc}
\fi
%---------------------------------------------------------------
\begin{document}
%---------------------------------------------------------------
\newcommand{\texima}[3]{
\begin{figure}[H]
\begin{center}
\ifpdf
% Dans le cas du PDF
% utiliser une image .png, .jpeg ou .jpg
\includegraphics[width=#2,height=#3]{#1.png}
\else
% et dans le cas du DVI / PS
% utiliser du .ps ou du .eps
\epsfig{figure=#1.eps,width=#2,height=#3}
\fi
\end{center}
\end{figure}
}
\newcommand{\texillustr}[3]{
\ifpdf
% Dans le cas du PDF
% utiliser une image .png, .jpeg ou .jpg
\includegraphics[width=#2,height=#3]{#1.png}
\else
% et dans le cas du DVI / PS
% utiliser du .ps ou du .eps
\epsfig{figure=#1.eps,width=#2,height=#3}
\fi
}
\input{couv.tex} % Page de garde
\tableofcontents % Sommaire
\clearpage
\chapter{Introduction}
\chapter{Installation}
\input{installation.tex}
%% Documentation du code
\chapter{Documentation du code}
\input{lib_generalite.tex}
\input{bd.tex}
\input{libpage.tex}
\input{libfournisseur.tex}
\input{liblistfournisseur.tex}
\input{demandeAchat.tex}
%\input{libLDachat.tex}
\input{libsecuremenu.tex}
\input{libuserinfo.tex}
\chapter{Documentation pour l'utilisateur}
\input{udoc_sommaire.tex}
\input{magasinier.tex}
\input{acheteur.tex}
\chapter{Conclusion}
\input {conclusion.tex}
\end{document}

BIN
doc/sommaire.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

24
doc/udoc_sommaire.tex Normal file
View file

@ -0,0 +1,24 @@
\section{Login}
\par Pour utiliser D'Astre.Net, l'utilisateur doit se connecter sur \url{dastre_url.serveur.domaine}.
\par La premiere page qui apparaît invite l'utilisateur à s'identifier.
L'utilisateur doit saisir son nom ainsi que son mot de passe, puis taper sur
la touche "Entrée" ou cliquer sur "\verb+Envoyer+".
\texima{sommaire}{12cm}{9cm}
\section{Le Menu}
\par Sur la gauche de l'écran est présent un menu spécifique à l'utilisateur.
Ce menu est composé de plusieurs rubriques (Informations, Actions, etc...), le
contenu de chaque rubrique étant indiqué sous le nom de la rubrique.\\
\par La rubrique "Information" indique l'utilisateur dont la session est ouverte,
et permet à celui-ci de quitter sa session à la fin de son travail.
\par La page "Sommaire ramène l'utilisateur à la page d'entrée de D'Astre.Net. \\
\par Les autres rubriques correspondent à des pages spécifiques de l'application,
et leur accès est limité en fonction des droits d'accès de l'utilisateur.

118
fournisseurs.php Normal file
View file

@ -0,0 +1,118 @@
<?php
include("includes.inc.php");
$page=new Page(__FILE__);
$_SESSION["referer"]=basename(__FILE__);
$page->startHeader();
?>
<link rel="stylesheet" href="/styles/fournisseurs.css" />
<?php
$page->endHeader();
$page->logCheck();
$page->startContent();
$listeFournisseurs=new ListeFournisseurs($_SESSION["userInfo"]->getID());
?>
<div id="contenu">
<h1>Gestion des fournisseurs : <i>
<?php print $listeFournisseurs->_familleName; ?></i>
</h1>
<?php
switch($_POST["action"]) {
case "Ajouter":
$listeFournisseurs->ajouteFournisseur(
$_POST["id_nFour"],
$_POST["nom_nFour"],
$_POST["adr_nFour"],
$listeFournisseurs->_familleId,
$_POST["tel_nFour"],
$_POST["fax_nFour"],
$_POST["siret_nFour"],
$_POST["siren_nFour"]
);
/* do nothing */
break;
case "Supprimer":
$listeFournisseurs->supprimeFournisseur($_POST["box_fourn"]);
break;
default:
break;
}
?>
<fieldset>
<legend>Ajout de fournisseurs</legend>
<form name="form"
method="post"
action="fournisseurs.php"
enctype="application/x-www-form-urlencoded"
>
<p>
Identifiant pour le fournisseur :
<input type="text" name="id_nFour" />
</p>
<p>
Nom du fournisseur:
<input type="text" name="nom_nFour" />
</p>
<p>
Adresse du fournisseur:
<input type="text" name="adr_nFour" />
</p>
<p>
Famille de produits:
<?php
print $listeFournisseurs->_familleName
. "(" . $listeFournisseurs->_familleId . ")";
?>
</p>
Num&eacute;ro de telephone:
<input type="text" name="tel_nFour">
</p>
<p>
Num&eacute;ro de fax:
<input type="text" name="fax_nFour">
</p>
<p>
Num&eacute;ro de SIRET:
<input type="text" name="siret_nFour">
</p>
<p>
Num&eacute;ro de SIREN:
<input type="text" name="siren_nFour">
</p>
<input type="reset" name="action" value="Annuler" />
<input type="submit" name="action" value="Ajouter" />
</form>
</fieldset>
<fieldset>
<legend align="top">Liste des fournisseurs existants</legend>
<form name="form"
method="post"
action="fournisseurs.php"
enctype="application/x-www-form-urlencoded" >
<?php
print $listeFournisseurs->toHTML(1);
?>
</form>
</fieldset>
<hr class="spacer" /> <!-- pour avoir toute la largeur !-->
</div> <!--end contenu !-->
<?php
/* $print listeFournisseurs(); */
$page->endContent();
$_SESSION["pageProvenance"]="fournisseur.php";
print $page->toHTML();
?>

0
icones/README Normal file
View file

BIN
icones/dastrenet.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

BIN
icones/users.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
images/background.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

31
includes.inc.php Normal file
View file

@ -0,0 +1,31 @@
<?php
/*
* Initialisation des chemins d'acces aux librairies
* de fonctions
*/
$inc_dir=dirname(__FILE__)."/includes";
$conf_dir=dirname(__FILE__)."/config";
$data_dir=dirname(__FILE__)."/data";
$include_path=ini_get('include_path');
$include_path.=":$inc_dir:$conf_dir:$data_dir";
ini_set('include_path', $include_path);
/*
* Bibliothèques à utiliser.
*/
require("db.conf.php");
require("libpage.inc.php");
require("libsecuremenu.inc.php");
require("libLDachat.inc.php");
require("libuserinfo.inc.php");
require("libfournisseurs.inc.php");
require("liblistefournisseurs.inc.php");
require("liblisteDA.inc.php");
require("libproduits.inc.php");
require("liblisteproduits.inc.php");
require("libcommandes.inc.php");
?>

0
includes/README Normal file
View file

304
includes/libLDachat.inc.php Normal file
View file

@ -0,0 +1,304 @@
<?php // TODO: faire les changements apportés avec l'apparition du champ numero de DA
if (!defined("LIBLDACHAT_INC")){
define(LIBLDACHAT_INC,1);
/*
* classe qui correspond à une ligne d'achat
*/
class LDachat {
var $famille;
var $produit;
var $quantite;
var $_da_id;
/*var $date_livr;*/
function LDachat($fam, $prod, $qte,$da_id=-1) {
$this->famille=$fam;
$this->produit=$prod;
$this->quantite=$qte;
$this->_da_id=$da_id;
}
} // FIN classe LDacaht
class DemandeAchat {
var $_id_mag;
var $_ligneAchat;
var $_ligneIdx;
var $_numero;
function DemandeAchat($id_mag){
/* initialiser les var */
$this->_id_mag=$id_mag;
$this->_ligneAchat=array();
$this->_ligneIdx=0;
//$this->_numero=666;
}
function load($id_da){
// rempli l'objet DA a partir de la base pour l'id id_da
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if(!$connexion) {
echo "Erreur serveur mysql $connexion";
}
$requete1="SELECT * FROM Ligne_d_achat "
."WHERE numero_da=".$id_da;
$result1=mysql_db_query(SQL_BASE, $requete1, $connexion)
or die(mysql_error($connexion));
while($row=mysql_fetch_object($result1)) {
$prod_ref_in=$row->reference_interne;
$prod_qte=$row->quantite;
$requete2="SELECT nom_fam FROM Produit_Interne, Famille_de_produit "
."WHERE Produit_Interne.reference_fam=Famille_de_produit.reference_fam "
."AND reference_interne='$prod_ref_in'";
$result2=mysql_db_query(SQL_BASE, $requete2, $connexion)
or die(mysql_error($connexion));
while($row=mysql_fetch_array($result2)) {
$this->ajouteLDA($row[0],
$prod_ref_in,
$prod_qte);
}
}
}
function ajouteLDA($famProd,$prodSelect,$quantiteDem,$prodUnit="kg"){
$lda = new LDachat($famProd, $prodSelect, $quantiteDem);
$this->_ligneAchat[$this->_ligneIdx]=&$lda;
$this->_ligneIdx++;
}
function supprimeLDA($Cases_supp){
// on cherche les lignes selectionnees pour la suppression
if (is_array($Cases_supp)){
while( list($case,$val) = each($Cases_supp) ){
// on supprime les lignes selectionnees
$idx=preg_replace("/Check_/","",$val);
unset($this->_ligneAchat[$idx]);
}
// on reindexe les tableaux
$tmp_tab = array_values($this->_ligneAchat);
$this->_ligneAchat = $tmp_tab;
$this->_ligneIdx=count($this->_ligneAchat);
}
}
function toHTML($editable=0){
if ($this->_ligneIdx<1){
$content="";
} else {
for($i=0;$i<$this->_ligneIdx;$i++) {
$content.="<p class=\"ligne".($i % 2)."\">";
if ($editable){
$content.="<input type=\"checkbox\" "
."id=\"Case_suppr[]\" "
."name=\"Case_suppr[]\" "
."value=\"Check_$i\" /> ";
}
$content.="<span class=\"DAfamille\">";
$content.=$this->_ligneAchat[$i]->famille;
$content.="</span> ";
$content.="<span class=\"DAproduit\">";
$content.=$this->_ligneAchat[$i]->produit;
$content.="</span> ";
$content.="<span class=\"DAquantite\">";
$content.=$this->_ligneAchat[$i]->quantite;
$content.="</span> ";
$content.="\n";
$content.="</p>";
}
$content.="<br />";
if ($editable){
$content.="\n<input type=\"submit\" "
."name=\"action\" "
."value=\"Supprimer\" /> ";
}
}
return $content;
}
/*
* fonction qui insere la demande d'achat dans la base de donnees
*/
function insereBD() {
/*
* connexion a la base de donnees
*/
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if (!$connexion) {
echo "Erreur serveur mysql $connexion";
}
/*
* insertion dans la base de donnees
*/
do{
$requete="SELECT max(numero_da) AS newId FROM Demande_d_achat";
$resultat=mysql_db_query(SQL_BASE,$requete,$connexion)
or die(mysql_error($connexion));
$row=mysql_fetch_object($resultat);
$id_DA=$row->newId;
if ($id_DA!= "NULL"){
$id_DA+=1;
} else {
$id_DA=1;
}
//TODO: remplacer la date bidon par une vraie
$date = date("Y")."-".date("m")."-".date("d");
$requete="INSERT INTO Demande_d_achat (numero_da, date, id_magasinier) "
."VALUES ('', '$date','".$this->_id_mag."')";
$resultat=mysql_db_query(SQL_BASE,$requete,$connexion);
$numeroDA=mysql_insert_id();
} while (!$resultat);
// insertion des lignes d'achat
for($i=0; $i<$this->_ligneIdx; $i++) {
$id_LDA=-1;
$requete=0;
$resultat=0;
do{
$requete="SELECT max(numero_lda) AS newId from Ligne_d_achat";
$resultat=mysql_db_query(SQL_BASE,$requete,$connexion)
or die(mysql_error($connexion));
$row=mysql_fetch_object($resultat);
$id_LDA=$row->newId;
if ($id_LDA!= "NULL"){
$id_LDA+=1;
} else {
$id_LDA=1;
}
$requete="INSERT INTO Ligne_d_achat (numero_lda, "
."numero_da, "
."reference_interne, "
."quantite) "
."VALUES ('$id_LDA', '$numeroDA', "
."'".$this->_ligneAchat[$i]->produit."', "
."'".$this->_ligneAchat[$i]->quantite."');";
$resultat=mysql_db_query(SQL_BASE,$requete,$connexion);
} while(!$resultat);
//TODO: corriger date
$date = date("Y")."-".date("m")."-".date("d");
$requete="INSERT INTO Etats_LA "
."(date,Libelle,numero_lda,quantite_recue) "
."VALUES "
."('$date','CREE','$id_LDA','0')";
$resultat=mysql_db_query(SQL_BASE,$requete,$connexion)
or die(mysql_error($connexion));
} // next lda
}
}// END Class DemandeAchat
/*
* fonctions pour creer les menus deroulant
*/
function menu_deroulant_familleProd ($famille) {
echo "<option value=\"$famille\">$famille</option>\n";
}
function menu_deroulant_Produits ($ref_int, $designation) {
$ref_des = "".$ref_int." : ".$designation;
echo "<option value=\"$ref_int\">$ref_des</option>\n";
}
/*
* fonction qui donne les familles de produits
*/
function donne_familles() {
/*
* Connexion a la base de donnees
*/
require("db.conf.php");
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
/*
* Requete et resultat
*/
$familles = array();
$requete="SELECT nom_fam FROM Famille_de_produit";
$resultat=mysql_db_query(SQL_BASE,$requete,$connexion)
or die($requete.":".mysql_error($connexion));
while ($ligneTab= mysql_fetch_array($resultat)) {
$familles[] = $ligneTab[0];
}
return $familles;
}
/*
* fonction qui cherche les produits en fonctions de la famille selectionnée
*/
function trouve_produits($ref_famille) {
require("db.conf.php");
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if (!$connexion) {
echo "Erreur serveur mysql $connexion";
}
/* on cherche les produits associes */
$produits = array();
$requetePROD="SELECT reference_interne, ".
"designation ".
"FROM Produit_Interne ".
"WHERE reference_fam=".$ref_famille;
$resultatPROD=mysql_db_query(SQL_BASE,$requetePROD,$connexion)
or die($requetePROD.":".mysql_error($connexion));
while ($lignePROD = mysql_fetch_array($resultatPROD)) {
$produits[] = $lignePROD[0];
$produits[] = $lignePROD[1];
}
return $produits;
}
/*
* fonction permettant de convertir du php en javascript
*/
function convertToJS($var) {
if (is_array($var)) {
$res = "[";
$array = array();
foreach ($var as $a_var) {
$array[] = convertToJS($a_var);
}
return "(" . join(",", $array) . ")";
}
elseif (is_bool($var)) {
return $var ? "true" : "false";
}
elseif (is_int($var) || is_integer($var) || is_double($var) || is_float($var)) {
return $var;
}
elseif (is_string($var)) {
return "'" . addslashes(stripslashes($var)) . "'";
}
// autres cas: objets, on ne les gère pas
return FALSE;
}
} // defined LIBLDACHAT_INC
?>

View file

@ -0,0 +1,340 @@
<?php
if (!defined("LIBCOMMANDES_INC")){
define(LIBCOMMANDES_INC,1);
class LigneCommande {
var $_prod_in;
var $_prod_four;
var $_LDAtab; //Liste Demande Achat
var $_LLDAtab;
var $_prix;
function LigneCommande($refprod,&$LDAtab,$ref_fourn){
$this->_prod_in=$refprod;
$this->_prod_four=$ref_fourn;
$this->_LDAtab=$LDAtab;
$this->getLLDA();
}
function getLLDA(){
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if ($connexion){
$this->_LLDAtab=array();
for ($i=0;$i<count($this->_LDAtab);$i++){
$numDA=$this->_LDAtab[$i];
$requete="SELECT LDA.numero_lda AS num_lda "
."FROM Ligne_d_achat AS LDA, Etats_LA AS ELA "
."WHERE LDA.numero_lda=ELA.numero_LDA "
."AND Libelle='CREE' "
."AND numero_da='$numDA' "
."AND reference_interne='".$this->_prod_in."'";
$resultat=mysql_db_query(SQL_BASE, $requete,$connexion);
if ($resultat){
$row=mysql_fetch_object($resultat);
array_push($this->_LLDAtab,$row->num_lda);
} else {
print "<span class='error'>".mysql_error($connexion)."</span>";
}
} // for
mysql_close($connexion);
} else {
print "<span class='error'>".mysql_error($connexion)."</span>";
}
}
function save($uid){
$this->getLLDA();
//TODO : auto-increment
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if ($connexion){
$requete="INSERT INTO Ligne_de_commande "
."(numero_com,reference_fournisseur,quantite) "
."VALUES ('-$uid','".$this->_prod_four."','".$this->getQte()."')";
$resultat=mysql_db_query(SQL_BASE, $requete,$connexion) or
die(mysql_error($connexion));
$numero_ldc=mysql_insert_id();
// updater l'état des lda
for ($i=0;$i<count($this->_LLDAtab);$i++){
$requete="UPDATE Etats_LA "
."SET numero_ldc='$numero_ldc',Libelle='COMM' "
."WHERE numero_lda='".$this->_LLDAtab[$i]."'";
$resultat=mysql_db_query(SQL_BASE, $requete,$connexion) or
die(mysql_error($connexion));
}
mysql_close($connexion);
} else {
print "<span class='error'>".mysql_error($connexion)."</span>";
}
}
function getQte(){
//TODO:
// fait la somme des quantités des LDA
}
function getPrix(){
//TODO:
// qua
}
function toHTML(){
$content="";
$content.=$this->_prod_in;
$content.="&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;";
$content.=$this->_prod_four;
return $content;
}
}
class Commande {
var $_lignes;
var $_userID;
function Commande($userId){
$this->_userID=$userId;
}
function valideLC(){
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if (!$connexion){
print "<span class='error'>".mysql_error($connexion)."</span>";
}
// 1 .faire la liste des fournisseurs chez
// qui des commandes sont en attente
$requete="SELECT id_fournisseur "
."FROM Ligne_de_commande AS LDC, ProduitFour AS PF "
."WHERE LDC.reference_fournisseur=PF.reference_fournisseur "
."AND numero_com='-".$this->_userID."' "
."GROUP BY id_fournisseur";
$resultatf=mysql_db_query(SQL_BASE, $requete,$connexion) or
die ("<span class='error'>".mysql_error($connexion)."</span>");
// 2 .pour chaque fournisseur :
while($fournisseur=mysql_fetch_object($resultatf)){
// - créer une nouvelle commande
$date = date("Y")."-".date("m")."-".date("d");
$requete="INSERT INTO Commande "
."(date,id_acheteur,id_fournisseur) "
."VALUES ('$date',"
."'".$this->_userID."',"
."'".$fournisseur->id_fournisseur."')";
$resultat=mysql_db_query(SQL_BASE, $requete,$connexion) or
die ("<span class='error'>".mysql_error($connexion)."</span>");
$cmd_id=mysql_insert_id($connexion);
print ("<span class='error'>Id commande : $cmd_id</span>");
// - associer les lignes de commandes à la commande
// ( changer l'etat )
$requete="UPDATE Ligne_de_commande "
."SET numero_com='$cmd_id' "
."WHERE numero_com='-".$this->_userID."'";
$resultat=mysql_db_query(SQL_BASE, $requete,$connexion) or
die ("<span class='error'>".mysql_error($connexion)."</span>");
}
mysql_close($connexion);
}
function supprimeLC($Cases_supp){
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if (!$connexion){
print "<span class='error'>".mysql_error($connexion)."</span>";
}
if (!is_array($Cases_supp)){
die ("$Cases_supp must be an array !");
}
$LDCtab=array();
while( list($case,$val) = each($Cases_supp) ){
// on supprime les lignes selectionnees
$LDCtab[]=$val;
}
for ($i=0;$i<count($LDCtab);$i++){
//restaure l'état des lignes demande achat
$requete="UPDATE Etats_LA "
."SET numero_ldc=NULL,Libelle='CREE' "
."WHERE numero_ldc='".$LDCtab[$i]."'";
$resultat=mysql_db_query(SQL_BASE, $requete,$connexion) or
die ("<span class='error'>".mysql_error($connexion)."</span>");
//supprime la ligne de commande
$requete="DELETE FROM Ligne_de_commande "
."WHERE numero_ldc='".$LDCtab[$i]."'";
$resultat=mysql_db_query(SQL_BASE, $requete,$connexion) or
die ("<span class='error'>".mysql_error($connexion)."</span>");
}
mysql_close($connexion);
}
function ajouteLC($refprod,&$LDAtab,$ref_fourn){
$ligneCom=new LigneCommande($refprod,$LDAtab,$ref_fourn);
$ligneCom->save($this->_userID);
}
function toHTML(){
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if (!$connexion){
print "<span class='error'>".mysql_error($connexion)."</span>";
}
// on récupere les lignes d'achats en cours
$requete="SELECT numero_ldc,reference_fournisseur "
."FROM Ligne_de_commande AS LDC "
."WHERE LDC.numero_com='-".$this->_userID."'";
$resultat=mysql_db_query(SQL_BASE, $requete,$connexion) or
die ("<span class='error'>".mysql_error($connexion)."</span>");
$LDCtab=array();
$LDCInfoTab=array();
while ($row=mysql_fetch_object($resultat)){
array_push($LDCtab,$row->numero_ldc);
array_push($LDCInfoTab,$row->reference_fournisseur);
}
$content="";
for ($i=0;$i<count($LDCtab);$i++){
$content.="<dl class=\"ligne".($i%2)."\" >";
$content.="<dt><input type=\"checkbox\" "
."name=\"ligneCom[]\" id=\"ligneCom[]\" "
."value=\"".$LDCtab[$i]."\" />";
$content.="LDC°".$LDCtab[$i]." - ";
$content.="Ref fournisseur: ".$LDCInfoTab[$i];
$content.="</dt>";
$requete="SELECT numero_da,LDA.reference_interne,"
."PI.designation,PI.unite,quantite "
."FROM Etats_LA AS ELA, Ligne_d_achat as LDA, "
."Produit_Interne AS PI "
."WHERE numero_ldc='".$LDCtab[$i]."' "
."AND LDA.reference_interne=PI.reference_interne "
."AND ELA.numero_lda=LDA.numero_lda";
$resultat=mysql_db_query(SQL_BASE, $requete,$connexion) or
die ("<span class='error'>".mysql_error($connexion)."</span>");
while($row=mysql_fetch_object($resultat)){
$content.="<dd>\n";
$content.="<span class='id_da'>DA°".$row->numero_da."</span> - \n";
$content.="<span class='ref_in'>".$row->reference_interne."</span> : \n";
$content.="<span class='designation'>".$row->designation."</span> - \n";
$content.="<span class='quantite'>Qté: ".$row->quantite."</span> \n";
$content.="<span class='unite'>(".$row->unite.")</span> \n";
$content.="</dd>\n";
}
$content.="</dl>";
}
$content.="<br />";
$content.="<input type=\"submit\" name=\"action\" id=\"action\" "
." value=\"Supprimer\" />";
mysql_close($connexion);
return $content;
}
}
class CmdTool {
var $_famille;
var $_ref_in;
var $_lda;
function CmdTool($famille){
$this->_famille=$famille;
}
function FournToHTML($ref){
$content="";
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if ($connexion){
$requete="SELECT nom,F.id_fournisseur as idf,reference_fournisseur,prix,unite "
."FROM ProduitFour AS PF,Fournisseur as F "
."WHERE PF.id_fournisseur=F.id_fournisseur "
."AND reference_interne='$ref'";
$result=mysql_db_query(SQL_BASE,$requete,$connexion);
if ($result){
$content.="<select name=\"fourn_$ref\" id=\"fourn_$ref\" "
.">\n";
while($row=mysql_fetch_object($result)){
$content.="<option value=\"".$row->reference_fournisseur."\">\n";
$content.=$row->nom."&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;";
$content.="Ref. ".$row->reference_fournisseur;
$content.="&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;".$row->prix." &euro; / ".$row->unite;
$content.="</option>\n";
}
$content.="</select>\n";
} else {
print "<span class='error'>".mysql_error($connexion)."</span>";
}
mysql_close($connexion);
} else {
print "<span class='error'>".mysql_error($connexion)."</span>";
}
return $content;
}
function LDAtoHTML($ref){
$content="";
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if ($connexion){
$requete="SELECT numero_da, LDA.numero_lda, quantite, Date "
."FROM Ligne_d_achat AS LDA , Etats_LA AS ELA "
."WHERE LDA.numero_lda=ELA.numero_lda "
."AND Libelle='CREE' "
."AND reference_interne='$ref'";
$result=mysql_db_query(SQL_BASE,$requete,$connexion);
if ($result){
$content.="<select name=\"da_".$ref."[]\" id=\"da_".$ref."[]\" "
."multiple=\"multiple\" >\n";
while($row=mysql_fetch_object($result)){
$content.="<option value=\"".$row->numero_da."\">\n";
$content.="Le ".$row->Date;
$content.=", DA°".$row->numero_da." - ";
$content.="Qt&eacute; : ".$row->quantite;
$content.="</option>\n";
}
$content.="</select>\n";
} else {
print "<span class='error'>".mysql_error($connexion)."</span>";
}
mysql_close($connexion);
} else {
print "<span class='error'>".mysql_error($connexion)."</span>";
}
return $content;
}
function ReftoHTML(){
$content="";
for ($i=0;$i<count($this->_ref_in);$i++){
if ($i==0){
$content.="<option value=\"".$this->_ref_in[$i]."\">(Selectionner une reference)</option>\n";
}
$content.="<option>".$this->_ref_in[$i]."</option>\n";
}
return $content;
}
function chargeRef(){
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if ($connexion){
$requete="SELECT LDA.reference_interne AS ref_in "
."FROM Ligne_d_achat AS LDA, Etats_LA as ELA, Produit_Interne as PI "
."WHERE LDA.numero_lda=ELA.numero_lda "
."AND LDA.reference_interne=PI.reference_interne "
."AND Libelle='CREE' "
."AND reference_fam='".$this->_famille."' "
."GROUP BY LDA.reference_interne";
$result=mysql_db_query(SQL_BASE,$requete,$connexion);
if ($result){
$this->_ref_in=array();
while($row=mysql_fetch_object($result)){
array_push($this->_ref_in,$row->ref_in);
}
} else {
print "<span class='error'>".mysql_error($connexion)."</span>";
}
mysql_close($connexion);
} else {
print "<span class='error'>".mysql_error($connexion)."</span>";
}
} //function
} // class
}
?>

View file

@ -0,0 +1,16 @@
<?php
if (!define("LIBERRORMSG_INC")){
define(LIBERRORMSG_INC,1);
class ErrorMsg{
function ErrorMsg(){
//constructeur}
}
}
}
?>

View file

@ -0,0 +1,44 @@
<?php
if (!defined("LIBFOURNISSEURS_INC")){
define(LIBFOURNISSEURS_INC,1);
class Fournisseur {
var $_id;
var $_nom;
var $_adresse;
var $_famille;
var $_tel;
var $_fax;
var $_siret;
var $_siren;
function Fournisseur($id,$nom, $adresse, $famille, $tel, $fax, $siret, $siren){
$this->_nom = $nom;
$this->_adresse = $adresse;
$this->_famille = $famille;
$this->_tel = $tel;
$this->_fax = $fax;
$this->_siret = $siret;
$this->_siren = $siren;
$this->_id = $id;
}
function toHTML(){
// affichage
$content="";
$content.="<input type=\"checkbox\" "
."id=\"box_fourn[]\" "
."name=\"box_fourn[]\" "
."value=\"".$this->_id."\" />\n";
$content.="<span class=\"id_fourn\">".$this->_id."</span>\n";
$content.="<span class=\"nom_fourn\">".$this->_nom."</span>\n";
$content.="<span class=\"adresse_fourn\">".$this->_adresse."</span>\n";
$content.="<span class=\"tel_fourn\">".$this->_tel."</span>\n";
$content.="<span class=\"fax_fourn\">".$this->_fax."</span>\n";
$content.="<span class=\"siret_fourn\">".$this->_siret."</span>\n";
$content.="<span class=\"siren_fourn\">".$this->_siren."</span>\n";
return $content;
}
}
}
?>

146
includes/liblisteDA.inc.php Normal file
View file

@ -0,0 +1,146 @@
<?php
if (!defined("LIBLISTEDA_INC")){
define(LIBLISTEDA_INC,1);
/*
* classe qui correspond a une liste de DA
*/
class ListeDA {
var $_numDA;
var $_liste;
var $_id_mag;
var $_libelle;
function ListeDA($libelle,$id_mag) {
$this->_numDA=0;
$this->_liste=array();
// si id_mag < 0 alors on prend tous les id_mag
$this->_id_mag=$id_mag;
$this->_libelle=$libelle;
}
function ajouteDA($da) {
//$da = new DemandeAchat(0);
$this->_liste[$this->_numDA]=&$da;
$this->_numDA++;
}
function supprimeDA($Cases_supp) {
// on cherche les lignes selectionnees pour la suppression
if (is_array($Cases_supp)){
while( list($case,$val) = each($Cases_supp) ){
// on supprime les DA selectionnees de la BD
// tout d'abord de la BD
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if(!$connexion) {
echo "Erreur serveur mysql $connexion";
}
// on supprime également les états des lignes d'achat
// associees
$requete="SELECT numero_lda FROM Ligne_d_achat "
."WHERE numero_da='$val'";
$result=mysql_db_query(SQL_BASE, $requete, $connexion)
or die(mysql_error($connexion));
while($row=mysql_fetch_object($result)) {
$requete_ela="DELETE FROM Etats_LA "
."WHERE numero_lda='".$row->numero_lda."'";
$result_ela=mysql_db_query(SQL_BASE, $requete_ela, $connexion);
if (!$result_ela){
print "<span class=\"error\">";
print mysql_error($connexion);
print "</span>";
}
}
// ainsi que les LDA elles-même
$requete_lda="DELETE FROM Ligne_d_achat "
."WHERE numero_da='$val'";
$resultat=mysql_db_query(SQL_BASE, $requete_lda, $connexion);
if (!$resultat){
print "<span class=\"error\">";
print mysql_error($connexion);
print "</span>";
}
// et enfin la demande
$requete="DELETE FROM Demande_d_achat "
."WHERE numero_da='$val'";
//.$this->_liste[$idx]->_numero."'";
$result=mysql_db_query(SQL_BASE, $requete, $connexion)
or die(mysql_error($connexion));
// ensuite du tableau liste
}
// on reindexe le tableau
$this->loadListe();
}
}
function loadListe() {
// rempli l'objet ListeDA a partir de la base pour l'id id_mag
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if(!$connexion) {
echo "Erreur serveur mysql $connexion";
}
if($libelle!="TOUTES") {
$requete="SELECT Ligne_d_achat.numero_da "
."FROM Ligne_d_achat, Etats_LA, Demande_d_achat "
."WHERE Libelle='".$this->_libelle."' ";
if ($this->_id_mag>0){
$requete.="AND Demande_d_achat.id_magasinier='".$this->_id_mag."' ";
}
$requete.="AND Demande_d_achat.numero_da=Ligne_d_achat.numero_da "
."AND Ligne_d_achat.numero_lda=Etats_LA.numero_lda "
."GROUP BY Ligne_d_achat.numero_da";
}
else {
$requete="SELECT numero_da FROM Demande_d_achat";
if ($this->_id_mag>0){
$requete.=" WHERE id_magasinier='".$this->_id_mag."'";
}
}
$result=mysql_db_query(SQL_BASE, $requete, $connexion)
or die(mysql_error($connexion));
$this->_numDA=0;
$this->_liste=array();
while($row=mysql_fetch_array($result)) {
$da=new DemandeAchat($this->_id_mag);
$da->_numero=$row[0];
$da->load($row[0]);
$this->ajouteDA($da);
}
}
function toHTML($editable=1) {
for($i=0; $i<$this->_numDA; $i++) {
$content.="<fieldset>";
$content.="<legend>\n";
if ($editable) {
$content.="<input type=\"checkbox\" "
."id=\"demande_achat[]\" "
."name=\"demande_achat[]\" "
."value=\"".$this->_liste[$i]->_numero."\" "
.">";
}
$content.="Demande Achat n°".$this->_liste[$i]->_numero."</legend>\n";
$content.=$this->_liste[$i]->toHTML(0);
$content.="</fieldset>";
$content.="<br />";
}
return $content;
}
}// fin classe ListeDA
}
?>

View file

@ -0,0 +1,168 @@
<?php
if (!defined("LIBLISTEFOURNISSEURS_INC")){
define(LIBLISTEFOURNISSEURS_INC,1);
/*
* fonction permettant de savoir de quelle famille
* de produit est charger l'acheteur actuel
*/
class ListeFournisseurs {
var $_fournisseurs;
var $_fournisseursIdx;
var $_familleId;
var $_familleName;
function ListeFournisseurs($acheteurID){
$this->_fournisseurs=array();
$this->_fournisseursIdx=0;
$this->_familleId=-1;
$this->_familleName="Aucune famille de produit trouvée";
$this->setFamilleFromAcheteur($acheteurID);
$this->loadList();
}
function setFamilleFromAcheteur($acheteurID){
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if ($connexion){
// preparation de la requete :
$requete="SELECT reference_fam,nom_fam "
."FROM Famille_de_produit "
."WHERE id_acheteur='$acheteurID' "
."ORDER BY id_acheteur LIMIT 0,1";
// envoie de la requete
$resultat=mysql_db_query(SQL_BASE,$requete,$connexion)
or die($requete.":".mysql_error($connexion));
$row = mysql_fetch_object($resultat);
$this->_familleId=$row->reference_fam;
$this->_familleName=$row->nom_fam;
mysql_close($connexion);
} else {
mysql_error($connexion);
}
}
function ajouteFournisseur($id,$nom, $adresse,$famille,
$tel, $fax, $siret, $siren)
{
//TODO: escaper les valeurs
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if ($connexion){
$requete="INSERT INTO Fournisseur "
."(id_fournisseur,nom,adresse,telephone,fax,SIRET,"
."SIREN,reference_fam) "
."VALUES ('$id','$nom','$adresse','$tel','$fax','$SIRET',"
."'$SIREN','$famille')";
$result=mysql_db_query(SQL_BASE,$requete,$connexion);
if (!$result){
print "<span class='bad'>\nErreur :";
print mysql_error($connexion);
print "\n</span>\n";
}
} else {
mysql_error($connexion);
}
mysql_close($connexion);
$this->loadList();
}
function supprimeFournisseur($ids){
// on cherche les lignes selectionnees pour la suppression
//on supprime aussi les produits du fournisseur...
if (count($ids)>0){
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if ($connexion){
while( list($case,$val) = each($ids) ){
// on supprime les lignes selectionnees
$requete="DELETE FROM ProduitFour "
."WHERE id_fournisseur='$val' ";
$resultat=mysql_db_query(SQL_BASE,$requete,$connexion);
if(!$resultat){
print mysql_error($connexion);
}
$requete="DELETE FROM Fournisseur "
."WHERE id_fournisseur='$val' "
."AND reference_fam='".$this->_familleId."'";
$resultat=mysql_db_query(SQL_BASE,$requete,$connexion);
if(!$resultat){
print mysql_error($connexion);
}
}
mysql_close($connexion);
} // connexion
} // count
$this->loadList();
}
function loadList(){
// charge la liste des fournisseurs
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if ($connexion){
// preparation de la requete :
$requete="SELECT * "
."FROM Fournisseur "
."WHERE reference_fam='".$this->_familleId."' "
."ORDER BY id_fournisseur";
// envoie de la requete
$resultat=mysql_db_query(SQL_BASE,$requete,$connexion)
or die($requete.":".mysql_error($connexion));
$this->_fournisseurs=array();
$this->_fournisseursIdx=0;
while($row = mysql_fetch_object($resultat)){
$four=new Fournisseur(
$row->id_fournisseur,
$row->nom,
$row->adresse,
$row->reference_fam,
$row->telephone,
$row->fax,
$row->SIRET,
$row->SIREN
);
$this->_fournisseurs[$this->_fournisseursIdx]=$four;
$this->_fournisseursIdx+=1;
}
mysql_close($connexion);
} else {
mysql_error($connexion);
}
}
function toHTML($editable=0){
$content="";
if (!$editable){
$content.="<select name=\"fournisseur\">\n";
}
for ($i=0;$i<$this->_fournisseursIdx;$i++){
if ($editable) {
$content.="<p class=\"ligne".($i%2)."\" />\n";
$content.=$this->_fournisseurs[$i]->toHTML();
$content.="\n</p>\n";
} else {
$content.="<option "
."value=\"".$this->_fournisseurs[$i]->_id."\" "
.">";
$content.=$this->_fournisseurs[$i]->_id." - ";
$content.=$this->_fournisseurs[$i]->_nom;
$content.="</option>\n";
}
}
if (!$editable){
$content.="</select>\n";
} else {
if (count($this->_fournisseurs)>0){
$content.="<input type=\"submit\" "
."id=\"action\" "
."name=\"action\" "
."value=\"Supprimer\" "
."/>\n";
}
}
return $content;
}
}
}
?>

View file

@ -0,0 +1,168 @@
<?php
if (!defined("LIBLISTEPRODUITS_INC")){
define(LIBLISTEPRODUITS_INC,1);
class ListeProduits{
var $_famille;
var $_prodIn;
var $_prodInInfo;
var $_prodFo;
var $_prodFoInfo;
function ListeProduits($famille){
$this->_prodIn=array();
$this->_prodInInfo=array();
$this->_prodFo=array();
$this->_prodFoInfo=array();
$this->_famille=$famille;
$this->chargeListeInterne();
$this->chargeListeFournisseur();
}
function supprimeProduitFournisseur($ids){
// on cherche les lignes selectionnees pour la suppression
if (count($ids)>0){
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if ($connexion){
while( list($case,$val) = each($ids) ){
// on supprime les lignes selectionnees
$requete="DELETE FROM ProduitFour "
."WHERE reference_fournisseur='$val' ";
$resultat=mysql_db_query(SQL_BASE,$requete,$connexion);
if(!$resultat){
print mysql_error($connexion);
}
}
mysql_close($connexion);
} // connexion
} // count
$this->chargeListeFournisseur();
}
function ajouteProduitInterne($ref_in,$design,$unit){
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if ($connexion){
$requete="INSERT INTO Produit_Interne "
."( reference_interne, designation, unite, "
."reference_fam )"
."VALUES ('$ref_in','$design','$unit','".$this->_famille."')";
$result=mysql_db_query(SQL_BASE,$requete,$connexion);
if (!$result){
print "<span class='bad'>\nErreur :";
print mysql_error($connexion);
print "\n</span>\n";
}
} else {
mysql_error($connexion);
}
mysql_close($connexion);
$this->chargeListeInterne();
}
function ajouteProduitFournisseur(
$fourn,
$design,
$prix,
$unit,
$ref_out,
$ref_in){
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if ($connexion){
$requete="INSERT INTO ProduitFour "
."( reference_fournisseur, designation, prix, "
."unite,id_fournisseur,reference_interne )"
."VALUES ('$ref_out','$design','$prix','$unit',"
."'$fourn','$ref_in')";
$result=mysql_db_query(SQL_BASE,$requete,$connexion);
if (!$result){
print "<span class='bad'>\nErreur :";
print mysql_error($connexion);
print "\n</span>\n";
}
} else {
mysql_error($connexion);
}
mysql_close($connexion);
$this->chargeListeFournisseur();
}
function listeFournisseurToHTML(){
$content="";
for ($i=0;$i<count($this->_prodFo);$i++){
$content.="<p class=\"ligne".($i%2)."\" >";
$content.=$this->_prodFo[$i]->toHTML(1);
$content.="</p>";
}
return $content;
}
function referencesHTML(){
$content="";
$content.="<select id=\"prod_refin_old\" name=\"prod_refin_old\">";
for ($i=0;$i<count($this->_prodIn);$i++){
$content.="<option value='".$this->_prodIn[$i]."'>"
.$this->_prodIn[$i]." - ".$this->_prodInInfo[$i]
."</option>";
}
$content.="</select>";
return $content;
}
function chargeListeFournisseur(){
$connexion=@mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if ($connexion){
$requete="SELECT reference_fournisseur,designation,"
."prix,unite,A.id_fournisseur,reference_interne "
."FROM ProduitFour AS A, Fournisseur AS B "
."WHERE A.id_fournisseur=B.id_fournisseur "
."AND reference_fam='".$this->_famille."'";
$resultat=mysql_db_query(SQL_BASE,$requete,$connexion);
if ($resultat){
$this->_prodFo=array();
$this->_prodFoInfo=array();
while($row=mysql_fetch_object($resultat)){
//TODO:
$produit=new ProduitFournisseur(
$row->reference_fournisseur,
$row->designation,
$row->prix,
$row->unite,
$row->id_fournisseur,
$row->reference_interne
);
array_push($this->_prodFo,$produit);
}
}
mysql_close($connexion);
} else {
print mysql_error($connexion);
} // connexion
}
function chargeListeInterne(){
$connexion=@mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if ($connexion){
$requete="SELECT reference_interne,designation "
."FROM Produit_Interne "
."WHERE reference_fam='".$this->_famille."' "
."GROUP BY reference_interne";
$resultat=mysql_db_query(SQL_BASE,$requete,$connexion);
if ($resultat){
$this->_prodIn=array();
$this->_prodInInfo=array();
while($row=mysql_fetch_object($resultat)){
array_push($this->_prodIn,$row->reference_interne);
array_push($this->_prodInInfo,$row->designation);
}
}
mysql_close($connexion);
} else {
print mysql_error($connexion);
} // connexion
} //function
} // class
} // define
?>

128
includes/libpage.inc.php Normal file
View file

@ -0,0 +1,128 @@
<?php
if (!defined("LIBPAGE_INC")){
define(LIBPAGE_INC,1);
class Page{
var $_title;
var $_script;
var $_currentHeader;
var $_header;
var $_currentScript;
var $_content;
var $_referer;
var $_basedir;
function Page($referer=""){
$this->_referer=$referer;
$this->_basedir=dirname($referer);
$this->_script=array();
$this->_header=array();
$this->_currentScript=0;
$this->_currentHeader=0;
// initialiser les variables d'inclusion
// lancer la session
session_start();
// vérifier le login
}
function logCheck($authorizedLevel=0){
include("logcheck.php");
/* TODO: prévoir un niveau de check */
}
function setTitle($title){
}
function startHeader(){
ob_start();
}
function endHeader(){
$this->_header[$this->_currentHeader]=ob_get_contents();
$this->_currentHeader=$this->_currentHeader+1;
ob_end_clean();
}
function startScript(){
//TODO: faire en sorte de vérifier l'ordre des balises
ob_start();
print "<!-- Hide script\n"
."//<![CDATA[";
}
function endScript(){
//TODO: faire en sorte de vérifier l'ordre des balises
print "\n//]]> End script hiding -->\n";
$this->_script[$this->_currentScript]=ob_get_contents();
$this->_currentScript=$this->_currentScript+1;
ob_end_clean();
}
function startContent(){
//TODO: faire en sorte de vérifier l'ordre des balises
ob_start();
}
function endContent(){
//TODO: faire en sorte de vérifier l'ordre des balises
$this->_content=ob_get_contents();
ob_end_clean();
}
function toHTML(){
$htmlCode="";
/* Start of page */
ob_start();
include("header.inc.php");
$htmlCode.=ob_get_contents();
ob_end_clean();
/* Headers */
for($i=0;$i<$this->_currentHeader;$i++) {
$htmlCode.=$this->_header[$i];
}
/* Javascript */
$htmlCode.="<script language=\"JavaScript\" "
."type=\"text/javascript\">\n";
for($i=0;$i<$this->_currentScript;$i++) {
$htmlCode.="//script $i\n";
$htmlCode.=$this->_script[$i];
}
$htmlCode.="</script>\n";
/* Start of page */
ob_start();
include("bodystart.inc.php");
$htmlCode.=ob_get_contents();
ob_end_clean();
/* Content of page */
$htmlCode.=$this->_content;
/* Footer */
ob_start();
include("footer.inc.php");
$htmlCode.=ob_get_contents();
ob_end_clean();
/* End of page */
ob_start();
include("bodyend.inc.php");
$htmlCode.=ob_get_contents();
ob_end_clean();
return $htmlCode;
}
} // end class
} // end ifdef
?>

View file

@ -0,0 +1,259 @@
<?php
if (!defined("LIBPRODUITS_INC")){
define(LIBPRODUITS_INC,1);
function getFamilleFromAcheteur($id){
$famille=-1;
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if($connexion) {
$requete="SELECT reference_fam "
."FROM Famille_de_produit "
."WHERE id_acheteur='$id' "
."LIMIT 0,1";
$result=mysql_db_query(SQL_BASE, $requete, $connexion);
if ($result){
$row=mysql_fetch_object($result);
$famille=$row->reference_fam;
} else {
print "<span class='error'>".mysql_error($connexion)."</span>";
}
mysql_close($connexion);
}else {
echo "<span class='error'>".mysql_error($connexion)."</span>";
}
return $famille;
}
/*
* classe qui represente les produits internes
* avec le stock courant et les differents seuils
*/
class ProduitInterne {
var $_ref_in;
var $_stock;
var $_seuil_min;
var $_seuil_max;
var $_id_site;
function ProduitInterne($reference, $id_site) {
$this->_ref_in=$reference;
$this->_stock=0;
$this->_seuil_min=0;
$this->_seuil_max=0;
$this->_id_site=$id_site;
}
/*
* fonction qui insere les infos d'un produit
* ds la BD lorsque celui-ci n'est pas connu
*/
function insereInfos(){
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if(!$connexion) {
echo "<span class='error'>".mysql_error($connexion)."</span>";
}
$requete="INSERT INTO Stocker (id_site, "
."reference_interne, "
."stock, "
."seuil_min, "
."seuil_max) "
."VALUES ('".$this->_id_site."', "
."'".$this->_ref_in."', "
."'".$this->_stock."', "
."'".$this->_seuil_min."', "
."'".$this->_seuil_max."')";
$result=mysql_db_query(SQL_BASE, $requete, $connexion)
or die(mysql_error($connexion));
mysql_close($connexion);
}
/*
* fonction qui insere les nouvelles valeurs
* des seuils et du stock ds la BD
*/
function modifSeuils(){
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if(!$connexion) {
echo "Erreur serveur mysql $connexion";
}
$requete="UPDATE Stocker "
."SET stock='".$this->_stock."', "
."seuil_min='".$this->_seuil_min."', "
."seuil_max='".$this->_seuil_max."' "
."WHERE id_site='".$this->_id_site."' "
."AND reference_interne='".$this->_ref_in."' ";
$result=mysql_db_query(SQL_BASE, $requete, $connexion)
or die(mysql_error($connexion));
mysql_close($connexion);
}
/*
* fonction qui permet l'effacement d'un produit de la table stocker
*/
function supprProStck(){
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if(!$connexion) {
echo "Erreur serveur mysql $connexion";
}
$requete="DELETE FROM Stocker "
."WHERE reference_interne='".$this->_ref_in."' "
."AND id_site='".$this->_id_site."' ";
$result=mysql_db_query(SQL_BASE, $requete, $connexion)
or die(mysql_error($connexion));
mysql_close($connexion);
}
/*
* fonction qui permet de savoir si le produit
* est deja insere dans la table Stocker
*/
function exists() {
// TODO: regarder dans la table Stocker si le produit y est
// si oui: return TRUE, else FALSE
$connexion=@mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if(!$connexion) {
echo "Erreur serveur mysql $connexion";
}
$requete="SELECT reference_interne FROM Stocker "
."WHERE reference_interne='".$this->_ref_in."' "
."AND id_site='".$this->_id_site."' "
."LIMIT 0,1";
$result=mysql_db_query(SQL_BASE,$requete,$connexion);
$row=mysql_fetch_object($result);
mysql_close($connexion);
if($row) {
return 1;
}
else {
return 0;
}
}
/*
* fonction qui remplie l'objet produit avec les valeurs dans la base
* ou dans le cas d'un nouveau produit les initialisent a zero
*/
function rempliVals() {
if($this->exists()) {
$connexion=@mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if(!$connexion) {
echo "Erreur serveur mysql $connexion";
}
$requete="SELECT stock, seuil_min, seuil_max FROM Stocker "
."WHERE reference_interne='".$this->_ref_in."' "
."AND id_site='".$this->_id_site."' "
."LIMIT 0,1";
$result=mysql_db_query(SQL_BASE,$requete,$connexion);
$row=mysql_fetch_object($result);
// on rempli les champs avec les resultats de la requete
$this->_stock=$row->stock;
$this->_seuil_min=$row->seuil_min;
$this->_seuil_max=$row->seuil_max;
mysql_close($connexion);
}
else {
$this->_stock=0;
$this->_seuil_min=0;
$this->_seuil_max=0;
}
}
function toHTML(){
$content.="<fieldset>";
$content.="<legend>\n";
$content.="Modifier les informations du produit ".$this->_ref_in."</legend>\n";
$content.="<p>\n";
$content.="Stock ";
$content.="<input type=\"text\" name=\"stock\" value=\"".$this->_stock."\" />";
$content.="</p>\n";
$content.="<p>\n";
$content.="Seuil minimum ";
$content.="<input type=\"text\" name=\"seuil_min\" value=\"".$this->_seuil_min."\" />";
$content.="</p>\n";
$content.="<p>\n";
$content.="Seuil maximum ";
$content.="<input type=\"text\" name=\"seuil_max\" value=\"".$this->_seuil_max."\" />";
$content.="</p>\n";
$content.="<br />";
$content.="</fieldset>";
$content.="<br />";
$content.="<p>";
$content.="<input type=\"submit\" name=\"action\" value=\"Supprimer\" />";
$content.="<input type=\"submit\" name=\"action\" value=\"Accepter\" />";
$content.="</p>";
$content.="<br />";
return $content;
}
}// FIN classe ProduitInterne
class ProduitFournisseur {
var $_ref_fo;
var $_desig;
var $_prix;
var $_unite;
var $_id_fo;
var $_ref_in;
function ProduitFournisseur(
$ref_fo,
$desig,
$prix,
$unite,
$id_fo,
$ref_in){
$this->_ref_fo=$ref_fo;
$this->_desig=$desig;
$this->_prix=$prix;
$this->_unite=$unite;
$this->_id_fo=$id_fo;
$this->_ref_in=$ref_in;
}
function toHTML($editable=0){
$content="";
if ($editable){
$content.="<input type=\"checkbox\" "
."name=\"prod_id[]\" id=\"prod_id[]\" "
."value=\"".$this->_ref_fo."\" />\n";
}
$content.="<span class=\"refFo\" >".$this->_ref_fo."</span> \n";
$content.="<span class=\"desig\" >".$this->_desig."</span> \n";
$content.="<span class=\"prix\" >".$this->_prix."</span> \n";
$content.="<span class=\"unite\" >".$this->_unite."</span> \n";
$content.="<span class=\"idFo\" >".$this->_id_fo."</span> \n";
$content.="<span class=\"refIn\" >".$this->_ref_in."</span > \n";
return $content;
}
}
}
?>

View file

@ -0,0 +1,72 @@
<?php
if (!defined("LIBSECUREMENU_INC")){
define(LIBSECUREMENU_INC,1);
/* Definition de la classe pour le menu */
class SecureMenu {
var $_defaultLevel;
var $_params;
var $_name;
var $_url;
var $_level;
var $_currentLevel;
/*
* Crée un menu vide
*/
function SecureMenu($title,$level=0){
$this->_title=$title;
$this->_name=array();
$this->_url=array();
$this->_visible=array();
$this->_params=array();
$this->_defaultLevel=$level;
}
/*
* Ajoute une entrée au menu
*/
function addItem($param,$name="",$url=""){
array_push($this->_params,$param);
/* Verifie s'il s'agit d'un séparateur */
$this->_name[$param]="$name";
$this->_url[$param]="$url";
$this->_level[$param]=$this->_defaultLevel;
}
/*
* Active une entrée du menu
*/
function setItemLevel($param,$level){
$this->_level[$param]=$level;
}
function setCurrentLevel($level){
if ($level<0) { $level =0; }
$this->_currentLevel=$level;
}
function toHTML(){
$answer="<h1>".$this->_title."</h1>";
$answer.="<ul\n";
foreach ($this->_params as $param){
if (($this->_level[$param] ^ $this->_currentLevel)>0){
$answer.="<li>"
."<a href=\""
.$this->_url[$param]
."\">"
.$this->_name[$param]
."</a>"
."</li>\n";
}
}
$answer.="</ul>";
return $answer;
}
}
}
?>

View file

@ -0,0 +1,85 @@
<?php
if (!defined("LIBUSERINFO_INC")){
define(LIBUSERINFO_INC,1);
define(LIBUSERINFO_CAT_ACHETEUR,'ACH');
define(LIBUSERINFO_CAT_MAGASINIER,'MAG');
define(LIBUSERINFO_CAT_OTHER,'OTH');
class UserInfo {
var $_firstName;
var $_secondName;
var $_address;
var $_accessLevel;
var $_id;
var $_site;
function UserInfo($login, $accesslevel, $category, $catid){
$query="";
if ($category==LIBUSERINFO_CAT_OTHER){
} else {
switch($category){
case LIBUSERINFO_CAT_ACHETEUR:
$query="SELECT * FROM Acheteur WHERE ID_ACHETEUR='$catid' "
."ORDER BY ID_ACHETEUR DESC LIMIT 0,1";
break;
case LIBUSERINFO_CAT_MAGASINIER:
$query="SELECT * FROM Magasinier WHERE ID_MAGASINIER='$catid' "
."ORDER BY ID_MAGASINIER DESC LIMIT 0,1";
break;
default: break; /* TODO: ERREUR */
}
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if (!$connexion){
die("Erreur serveur mysql $connexion");
} else {
$result=mysql_db_query(SQL_BASE,$query)
or die($query.":".mysql_error($connexion));
//,$connexion)
if (mysql_num_rows($result)>0){
$row=mysql_fetch_object($result);
$this->_firstName=$row->nom;
$this->_secondName=$row->prenom;
$this->_address=$row->adresse;
$this->_tel=$row->telephone;
$this->_fax=$row->fax;
$this->_site=$row->id_site;
$this->_accessLevel=$accesslevel;
$this->_id=$catid;
/* TODO: remplir l'objet avec les valeurs de la BD */
} else {
mysql_error($connexion);
}
mysql_close($connexion);
}
}
}
function getFirstName(){
return $this->_firstName;
}
function getSecondName(){
return $this->_secondName;
}
function getID(){
return $this->_id;
}
function getSite(){
return $this->_site;
}
function getAccessLevel(){
return $this->_accessLevel;
}
}
}
?>

View file

@ -0,0 +1,53 @@
<!-- Hide script
//<![CDATA[
function changeFam_Prod(famille, listeProduits) {
// Cette fonction est appelee lorsque famille est change
// par un changement sur le famille
// Recupere la valeur de OPTION qui vient de changer
selected_value=famille.options[famille.selectedIndex].value;
// Recupere le texte de OPTION qui vient de changer
make=famille.options[famille.selectedIndex].text;
liste = new Array;
i=0;
<?php
$familles = donne_familles();
$famillesJS = convertToJS($familles);
?>
familles = new Array<?php echo $famillesJS; ?>;
<?php
for($fam=0;$fam<sizeof($familles);$fam++) {
print "if (make == familles[$fam]) {\n ";
// cherche les produits de la famille numero f
$prods = trouve_produits($fam+1);
$js = convertToJS($prods);
print "produits = new Array".$js.";\n";
print "for(j=0; j<produits.length; j=j+2) { "
."ref_design = produits[j] + \" : \" + produits[j+1];\n "
."liste[i++]=new Option(ref_design, produits[j]);\n "
."}\n "
."}\n ";
}
?>
if (i==0) {
alert("Erreur: il devrait se passer quelque chose, mais rien ne s'est produit");
}
else {
listeProduits.length=liste.length;
for (i=0; i < liste.length; i++) {
listeProduits.options[i]=liste[i];
}
listeProduits.options[0].selected=true;
}
}
//]]> End script hiding -->

51
index.php Normal file
View file

@ -0,0 +1,51 @@
<?php
include("includes.inc.php");
$page=new Page(__FILE__);
$_SESSION["referer"]=basename(__FILE__);
$page->logCheck();
$page->startContent();
?>
<div id="contenu">
<h2>D'Astre.Net</h2>
<p>
D'Astre.Net est la solution de gestion complète des achats et commandes fournisseurs
dans le réseau d'entreprise de D'Astre S.A.
</p>
<h2>Potentiel de l'application</h2>
<p>
Les actions possibles sont :
</p>
<ul>
<li> pour les acheteurs :
<ul>
<li>ajouter un fournisseur</li>
<li>ajouter un produit pour un fournisseur</li>
<li>lister les demandes d'achat en cours</li>
</ul>
</li>
<li> pour les magasiniers:
<ul>
<li>créer une demande d'achat</li>
<li>ajouter un produit à une demande d'achat (ligne de demande d'achat)</li>
</ul>
</li>
</ul>
une plate-forme permettant blablablabla.
blabla.
</p>
<hr class="spacer" /> <!-- pour avoir toute la largeur !-->
</div> <!-- end contenu !-->
<?php
$page->endContent();
print $page->toHTML();
?>

51
logcheck.php Normal file
View file

@ -0,0 +1,51 @@
<?php
/* vérifier si le login est dans la base */
/* récupérer les propriétés de l'user s'il est dans la base */
if (!$_SESSION["member"]){
require("db.conf.php");
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if (!$connexion) {
echo "Erreur serveur mysql $connexion";
} else {
/* protection des la requete */
$login=strip_tags($_POST["login"]);
$secureLogin=mysql_escape_string($login);
$securePass=md5($_POST["passwd"]);
$query="SELECT * FROM Users WHERE ( ".
"LOGIN='".$secureLogin."' AND ".
"PASS='".$securePass."' ".
") ORDER BY login DESC LIMIT 0,1";
$result=mysql_db_query(SQL_BASE,$query,$connexion)
or die($query.":".mysql_error($connexion));
if (mysql_num_rows($result)>0){
$row=mysql_fetch_object($result);
$_SESSION["member"]=$row->login;
$_SESSION["userInfo"]=new UserInfo(
$row->login,
$row->accesslevel,
$row->category,
$row->idcat
);
} else {
// stopper la session...
//print "$securePass";
//session_destroy();
}
//mysql_close($connexion);
}
}
if (!$_SESSION["member"]){
header("Location: login.php");
}
?>

39
login.php Normal file
View file

@ -0,0 +1,39 @@
<?php
include("includes.inc.php");
$page=new Page(__FILE__);
/* $page->logcheck(); */
$page->startContent();
/* include("header.inc.php"); */
?>
<div id="contenu">
<h1>Page d'identification</h1>
<p>Veuillez vous identifier afin d'accéder à la page
<b><?php print $_SESSION["referer"]; ?></b>.
</p>
<form action="<?php print $_SESSION["referer"]; ?>" method="post">
<p>Utilisateur :
<input type="text" name="login" id="login" />
</p>
<p>Mot de passe :
<input type="password" name="passwd" id="passwd" />
<input type="hidden" name="step" id="step" value="2" />
</p>
<input type="submit" value="Envoyer" />
</form>
<hr class="spacer" /> <!-- pour avoir toute la largeur !-->
</div> <!-- end contenu !-->
<?php
$page->endContent();
print $page->toHTML();
?>

7
logout.php Normal file
View file

@ -0,0 +1,7 @@
<?php
session_start();
session_destroy();
header("Location: index.php");
?>

146
produits.php Normal file
View file

@ -0,0 +1,146 @@
<?php
//TODO: gérer la suppression de produits
include("includes.inc.php");
$page=new Page(__FILE__);
$_SESSION["referer"]=basename(__FILE__);
$page->logCheck();
$page->startContent();
$listeFournisseurs=new ListeFournisseurs($_SESSION["userInfo"]->getID());
$listeProduits=new ListeProduits($listeFournisseurs->_familleId);
switch($_POST["action"]){
case "Ajouter": {
$ref_in="";
switch($_POST["prod_refin_type"]){
case "new": { $ref_in=$_POST["prod_refin_new"];
$listeProduits->ajouteProduitInterne($ref_in,$_POST["prod_refin_design"],$_POST["prod_unit"]);
}; break;
case "old": { $ref_in=$_POST["prod_refin_old"];
}; break;
default :break;
}
$listeProduits->ajouteProduitFournisseur(
$_POST["fournisseur"],
$_POST["prod_designation"],
$_POST["prod_prix"],
$_POST["prod_unit"],
$_POST["prod_ref"],
$ref_in
);
};
case "Supprimer": {
$listeProduits->supprimeProduitFournisseur($_POST["prod_id"]);
}; break;
break;
default: break;
}
$listeProduits->chargeListeInterne();
$listeProduits->chargeListeFournisseur();
?>
<div id="contenu">
<h1>Gestion des produits : <i>
<?php print $listeFournisseurs->_familleName; ?></i>
</h1>
<h2>Ajout de produits</h2>
<form name="form"
method="post"
action="produits.php"
enctype="application/x-www-form-urlencoded">
<?php
if (count($listeFournisseurs->_fournisseurs)>0){
?>
<fieldset>
<legend>Informations sur le produit</legend>
<p>Fournisseurs
<?php
print $listeFournisseurs->toHTML(0);
?>
</p>
<p>D&eacute;signation :
<input type="text"
name="prod_designation"
id="prod_designation"
/>
</p>
<p>Prix :
<input type="text"
name="prod_prix"
id="prod_prix"
/>
&euro; / Unit&eacute; :
<select id="prod_unit" name="prod_unit">
<option value="Piece">Pièce</option>
<option value="L">Litres</option>
<option value="Kg">Kilogrammes</option>
<option value="M">Mètres</option>
<option value="M^2">Mètres carrés</option>
<option value="M^3">Mètres cubes</option>
</select>
</p>
</fieldset>
<fieldset>
<legend>Références</legend>
<p>Reference fournisseur :
<input type="text"
name="prod_ref"
id="prod_ref" />
</p>
<dl><dt>Reference interne :</dt>
<dd><input type="radio" name="prod_refin_type" value="old" />
Existante :
<?php
print $listeProduits->referencesHTML();
?>
</dd>
<dd>
<input type="radio" name="prod_refin_type" value="new" />
Nouvelle
<ul>
<li>Référence : <input type="text" id="prod_refin_new" name="prod_refin_new" />
</li>
<li>
Description : <input type="text" id="prod_refin_design" name="prod_refin_design" />
</li>
</ul>
</dd>
</dl>
</p>
</fieldset>
<input type="reset" id="action" name="action" value="Annuler" />
<input type="submit" id="action" name="action" value="Ajouter" />
<h2>Liste des produits</h2>
<fieldset>
<legend>Produits de la base</legend>
<?php
print $listeProduits->listeFournisseurToHTML();
if (count($listeProduits->_prodFo)>0){
print "<input type=\"submit\" id=\"action\" name=\"action\" "
."value=\"Supprimer\" />";
}
?>
</fieldset>
<?php
} else {
print "Opération impossible tant qu'aucun founisseur n'est ajouté";
}
?>
</form>
<hr class="spacer" /> <!-- pour avoir toute la largeur !-->
</div> <!--end contenu !-->
<?php
$page->endContent();
print $page->toHTML();
?>

584
sql/MCDTrac.ger Normal file
View file

@ -0,0 +1,584 @@
CasDAstre
C:/Cygwin/home/SCHAWOHL/CasDAstre/sql/MCDTrac.ger
Anonymous GNUdist
18
41
0 0 1924 868
16
Magasinier
155
502
6
id_magasinier int
nom varchar(32)
prenom varchar(32)
adresse varchar(32)
telephone varchar(10)
fax varchar(10)
1
id_magasinier
2
Se_situer
Emettre
Site
25
683
5
id_site int
nom varchar(32)
adresse varchar(32)
telephone int
fax int
1
id_site
4
Se_situer
Appartenir
Se_faire_sur
Stocker
Ligne_d_achat
218
223
1
numero_lda int
1
numero_lda
4
Comporter
Avoir
LA_donne_lieu_a_LC
LA_avoir_Etat
Demande_d_achat
285
371
2
date date
numero_da int
1
numero_da
3
Emettre
Concerne
Comporter
Produit_Interne
126
0
3
reference_interne varchar(32)
designation varchar(32)
unite varchar(8)
1
reference_interne
4
Avoir
PI_correspondre_PF
PI_appartient_FdP
Stocker
Acheteur
693
675
6
id_acheteur int
nom varchar(32)
prenom varchar(32)
adresse varchar(32)
telephone varchar(10)
fax varchar(10)
1
id_acheteur
3
Appartenir
Rediger
A_s_occupe_FdP
Ligne_de_commande
686
184
1
numero_ldc int
1
numero_ldc
5
Posseder
LA_donne_lieu_a_LC
Constituer
LL_correspondre_LC
LC_avoir_Etat
Livraison
1245
776
1
numero_liv varchar(32)
1
numero_liv
5
Generer
Contribuer
Realiser
Contenir
Se_faire_sur
LigneLivraison
1663
81
1
numero_lv varchar(32)
1
numero_lv
4
Apparaitre_dans
LL_correspondre_LC
LL_correspondre_LR
Contenir
Commande
695
479
5
date date
date_livraison date
heure_livr_min time
heure_livr_max time
numero_com int
1
numero_com
5
Concerne
Rediger
Generer
Posseder
Effectuer
ProduitFour
657
59
4
reference_fournisseur varchar(32)
designation varchar(32)
prix float
unite varchar(8)
1
reference_fournisseur
4
PI_correspondre_PF
Vendre
Constituer
Apparaitre_dans
Fournisseur
1217
241
7
nom varchar(32)
adresse varchar(32)
telephone int
fax int
SIRET varchar(32)
SIREN varchar(32)
id_fournisseur varchar(32)
1
id_fournisseur
4
Vendre
Effectuer
Realiser
F_fournit_FdP
LigneReception
1663
800
1
numero_lr int
1
numero_lr
3
LR_correspond_R
LL_correspondre_LR
LR_avoir_Etat
Reception
1483
634
1
numero_recept int
1
numero_recept
2
Contribuer
LR_correspond_R
Etats_LA
470
364
3
Date date
Libelle varchar(32)
id_ela int
1
id_ela
3
LA_avoir_Etat
LC_avoir_Etat
LR_avoir_Etat
Famille_de_produit
910
15
2
nom_fam varchar(32)
reference_fam int
1
reference_fam
3
A_s_occupe_FdP
PI_appartient_FdP
F_fournit_FdP
29
Se_situer
0
157
631
0
2
Site
0
N
Magasinier
1
1
Emettre
0
157
457
0
2
Magasinier
0
N
Demande_d_achat
1
1
Appartenir
0
317
720
0
2
Acheteur
1
1
Site
0
N
Rediger
0
695
598
0
2
Commande
1
1
Acheteur
0
N
Concerne
0
333
516
0
2
Demande_d_achat
0
N
Commande
1
N
Comporter
0
218
302
0
2
Demande_d_achat
1
N
Ligne_d_achat
1
1
Generer
0
1245
555
0
2
Commande
0
N
Livraison
1
1
Posseder
0
695
333
0
2
Commande
1
N
Ligne_de_commande
1
1
Avoir
0
218
158
1
quantite float
2
Ligne_d_achat
1
1
Produit_Interne
0
N
Contribuer
0
1461
784
0
2
Livraison
0
1
Reception
1
N
Effectuer
0
1237
499
0
2
Fournisseur
0
N
Commande
1
1
Constituer
0
470
128
1
quantite float
2
ProduitFour
0
N
Ligne_de_commande
1
1
Realiser
0
1428
286
1
date date
2
Livraison
1
1
Fournisseur
0
N
LA_avoir_Etat
0
430
285
0
2
Ligne_d_achat
1
N
Etats_LA
0
1
LC_avoir_Etat
0
595
286
0
2
Ligne_de_commande
1
N
Etats_LA
0
1
LR_correspond_R
0
1561
715
0
2
Reception
1
N
LigneReception
1
1
LL_correspondre_LC
0
1419
192
0
2
Ligne_de_commande
0
N
LigneLivraison
1
1
Apparaitre_dans
0
1415
82
1
quantite float
2
ProduitFour
0
N
LigneLivraison
1
1
Vendre
0
1139
144
0
2
ProduitFour
1
1
Fournisseur
1
N
PI_correspondre_PF
0
400
89
0
2
Produit_Interne
0
N
ProduitFour
1
1
LL_correspondre_LR
0
1649
542
0
2
LigneLivraison
0
1
LigneReception
1
1
Contenir
0
1563
249
0
2
Livraison
1
N
LigneLivraison
1
1
Se_faire_sur
0
242
784
0
2
Livraison
1
1
Site
0
N
LR_avoir_Etat
0
470
801
1
quantite_recue float
2
Etats_LA
0
1
LigneReception
1
N
LA_donne_lieu_a_LC
0
421
185
1
quantite float
2
Ligne_d_achat
0
N
Ligne_de_commande
1
N
A_s_occupe_FdP
0
924
720
0
2
Acheteur
1
1
Famille_de_produit
1
1
PI_appartient_FdP
0
489
30
0
2
Produit_Interne
1
1
Famille_de_produit
1
N
F_fournit_FdP
0
1237
30
0
2
Famille_de_produit
0
N
Fournisseur
1
1
Stocker
0
25
321
3
stock float
seuil_min float
seuil_max float
2
Site
0
N
Produit_Interne
1
N

8
sql/README Normal file
View file

@ -0,0 +1,8 @@
README
------
Ordre d'execution des scripts SQL :
- db-create.sql (creation des tables du MCD)
- db-userbase-create.sql (ajout d'une table pour les password/acces)
- db-alter-inc.sql (auto-increment sur certains ID)
- db-users-fill.sql (remplissage des acces utilisateur)

22
sql/db-alter-inc.sql Normal file
View file

@ -0,0 +1,22 @@
ALTER TABLE casdastre.Acheteur CHANGE id_acheteur
id_acheteur INT(11) DEFAULT '0' NOT NULL AUTO_INCREMENT;
ALTER TABLE casdastre.Magasinier CHANGE id_magasinier
id_magasinier INT(11) DEFAULT '0' NOT NULL AUTO_INCREMENT;
ALTER TABLE casdastre.Demande_d_achat CHANGE numero_da
numero_da INT(11) DEFAULT '0' NOT NULL AUTO_INCREMENT;
ALTER TABLE casdastre.Ligne_d_achat CHANGE numero_lda
numero_lda INT(11) DEFAULT '0' NOT NULL;
ALTER TABLE casdastre.Etats_LA CHANGE id_ela
id_ela INT(11) DEFAULT '0' NOT NULL AUTO_INCREMENT;
ALTER TABLE casdastre.Ligne_de_commande CHANGE numero_ldc
numero_ldc INT(11) DEFAULT '0' NOT NULL AUTO_INCREMENT;
ALTER TABLE casdastre.Commande CHANGE numero_com
numero_com INT(11) DEFAULT '0' NOT NULL AUTO_INCREMENT;

322
sql/db-create-mcd.sql Normal file
View file

@ -0,0 +1,322 @@
-- Automatically generated by Gerwin
--
-- Project CasDAstre
-- From file: /Users/warbrain/Sites/CasDAstre/sql/MCDTrac.ger
-- By: Anonymous GNUdist
--
-- Using output format: mysql
CREATE TABLE Magasinier (
id_magasinier int NOT NULL,
nom varchar(32),
prenom varchar(32),
adresse varchar(32),
telephone varchar(10),
fax varchar(10),
id_site int NOT NULL
);
ALTER TABLE Magasinier ADD PRIMARY KEY (id_magasinier);
CREATE TABLE Site (
id_site int NOT NULL,
nom varchar(32),
adresse varchar(32),
telephone int,
fax int
);
ALTER TABLE Site ADD PRIMARY KEY (id_site);
CREATE TABLE Ligne_d_achat (
numero_lda int NOT NULL,
numero_da int NOT NULL,
reference_interne varchar(32),
quantite float
);
ALTER TABLE Ligne_d_achat ADD PRIMARY KEY (numero_lda);
CREATE TABLE Demande_d_achat (
date date,
numero_da int NOT NULL,
id_magasinier int NOT NULL
);
ALTER TABLE Demande_d_achat ADD PRIMARY KEY (numero_da);
CREATE TABLE Produit_Interne (
reference_interne varchar(32) NOT NULL,
designation varchar(32),
unite varchar(8),
reference_fam int NOT NULL
);
ALTER TABLE Produit_Interne ADD PRIMARY KEY (reference_interne);
CREATE TABLE Acheteur (
id_acheteur int NOT NULL,
nom varchar(32),
prenom varchar(32),
adresse varchar(32),
telephone varchar(10),
fax varchar(10),
id_site int
);
ALTER TABLE Acheteur ADD PRIMARY KEY (id_acheteur);
CREATE TABLE Ligne_de_commande (
numero_ldc int NOT NULL,
numero_com int NOT NULL,
reference_fournisseur varchar(32) NOT NULL,
quantite float
);
ALTER TABLE Ligne_de_commande ADD PRIMARY KEY (numero_ldc);
CREATE TABLE Livraison (
numero_liv varchar(32) NOT NULL,
numero_com int NOT NULL,
numero_recept int NOT NULL,
id_fournisseur varchar(32),
date date,
id_site int
);
ALTER TABLE Livraison ADD PRIMARY KEY (numero_liv);
CREATE TABLE LigneLivraison (
numero_lv varchar(32) NOT NULL,
numero_ldc int NOT NULL,
reference_fournisseur varchar(32) NOT NULL,
quantite float,
numero_lr int NOT NULL,
numero_liv varchar(32) NOT NULL
);
ALTER TABLE LigneLivraison ADD PRIMARY KEY (numero_lv);
CREATE TABLE Commande (
date date,
date_livraison date,
heure_livr_min time,
heure_livr_max time,
numero_com int NOT NULL,
id_acheteur int,
id_fournisseur varchar(32) NOT NULL
);
ALTER TABLE Commande ADD PRIMARY KEY (numero_com);
CREATE TABLE ProduitFour (
reference_fournisseur varchar(32) NOT NULL,
designation varchar(32),
prix float,
unite varchar(8),
id_fournisseur varchar(32) NOT NULL,
reference_interne varchar(32) NOT NULL
);
ALTER TABLE ProduitFour ADD PRIMARY KEY (reference_fournisseur);
CREATE TABLE Fournisseur (
nom varchar(32),
adresse varchar(32),
telephone int,
fax int,
SIRET varchar(32),
SIREN varchar(32),
id_fournisseur varchar(32) NOT NULL,
reference_fam int NOT NULL
);
ALTER TABLE Fournisseur ADD PRIMARY KEY (id_fournisseur);
CREATE TABLE LigneReception (
numero_lr int NOT NULL,
numero_recept int NOT NULL
);
ALTER TABLE LigneReception ADD PRIMARY KEY (numero_lr);
CREATE TABLE Reception (
numero_recept int NOT NULL
);
ALTER TABLE Reception ADD PRIMARY KEY (numero_recept);
CREATE TABLE Etats_LA (
Date date,
Libelle varchar(32),
id_ela int NOT NULL,
numero_lda int,
numero_ldc int,
numero_lr int NOT NULL,
quantite_recue float
);
ALTER TABLE Etats_LA ADD PRIMARY KEY (id_ela);
CREATE TABLE Famille_de_produit (
nom_fam varchar(32),
reference_fam int NOT NULL,
id_acheteur int NOT NULL
);
ALTER TABLE Famille_de_produit ADD PRIMARY KEY (reference_fam);
CREATE TABLE Concerne (
numero_da int NOT NULL,
numero_com int NOT NULL
);
ALTER TABLE Concerne ADD PRIMARY KEY (numero_da,numero_com);
CREATE TABLE LA_donne_lieu_a_LC (
numero_lda int NOT NULL,
numero_ldc int NOT NULL,
quantite float
);
ALTER TABLE LA_donne_lieu_a_LC ADD PRIMARY KEY (numero_lda,numero_ldc);
CREATE TABLE Stocker (
id_site int NOT NULL,
reference_interne varchar(32) NOT NULL,
stock float,
seuil_min float,
seuil_max float
);
ALTER TABLE Stocker ADD PRIMARY KEY (id_site,reference_interne);
ALTER TABLE Magasinier ADD FOREIGN KEY (id_site) REFERENCES Site (id_site);
ALTER TABLE Ligne_d_achat ADD FOREIGN KEY (numero_da) REFERENCES Demande_d_achat (numero_da);
ALTER TABLE Ligne_d_achat ADD FOREIGN KEY (reference_interne) REFERENCES Produit_Interne (reference_interne);
ALTER TABLE Demande_d_achat ADD FOREIGN KEY (id_magasinier) REFERENCES Magasinier (id_magasinier);
ALTER TABLE Produit_Interne ADD FOREIGN KEY (reference_fam) REFERENCES Famille_de_produit (reference_fam);
ALTER TABLE Acheteur ADD FOREIGN KEY (id_site) REFERENCES Site (id_site);
ALTER TABLE Ligne_de_commande ADD FOREIGN KEY (numero_com) REFERENCES Commande (numero_com);
ALTER TABLE Ligne_de_commande ADD FOREIGN KEY (reference_fournisseur) REFERENCES ProduitFour (reference_fournisseur);
ALTER TABLE Livraison ADD FOREIGN KEY (numero_com) REFERENCES Commande (numero_com);
ALTER TABLE Livraison ADD FOREIGN KEY (numero_recept) REFERENCES Reception (numero_recept);
ALTER TABLE Livraison ADD FOREIGN KEY (id_fournisseur) REFERENCES Fournisseur (id_fournisseur);
ALTER TABLE Livraison ADD FOREIGN KEY (id_site) REFERENCES Site (id_site);
ALTER TABLE LigneLivraison ADD FOREIGN KEY (numero_ldc) REFERENCES Ligne_de_commande (numero_ldc);
ALTER TABLE LigneLivraison ADD FOREIGN KEY (reference_fournisseur) REFERENCES ProduitFour (reference_fournisseur);
ALTER TABLE LigneLivraison ADD FOREIGN KEY (numero_lr) REFERENCES LigneReception (numero_lr);
ALTER TABLE LigneLivraison ADD FOREIGN KEY (numero_liv) REFERENCES Livraison (numero_liv);
ALTER TABLE Commande ADD FOREIGN KEY (id_acheteur) REFERENCES Acheteur (id_acheteur);
ALTER TABLE Commande ADD FOREIGN KEY (id_fournisseur) REFERENCES Fournisseur (id_fournisseur);
ALTER TABLE ProduitFour ADD FOREIGN KEY (id_fournisseur) REFERENCES Fournisseur (id_fournisseur);
ALTER TABLE ProduitFour ADD FOREIGN KEY (reference_interne) REFERENCES Produit_Interne (reference_interne);
ALTER TABLE Fournisseur ADD FOREIGN KEY (reference_fam) REFERENCES Famille_de_produit (reference_fam);
ALTER TABLE LigneReception ADD FOREIGN KEY (numero_recept) REFERENCES Reception (numero_recept);
ALTER TABLE Etats_LA ADD FOREIGN KEY (numero_lda) REFERENCES Ligne_d_achat (numero_lda);
ALTER TABLE Etats_LA ADD FOREIGN KEY (numero_ldc) REFERENCES Ligne_de_commande (numero_ldc);
ALTER TABLE Etats_LA ADD FOREIGN KEY (numero_lr) REFERENCES LigneReception (numero_lr);
ALTER TABLE Famille_de_produit ADD FOREIGN KEY (id_acheteur) REFERENCES Acheteur (id_acheteur);
ALTER TABLE Concerne ADD FOREIGN KEY (numero_da) REFERENCES Demande_d_achat (numero_da);
ALTER TABLE Concerne ADD FOREIGN KEY (numero_com) REFERENCES Commande (numero_com);
ALTER TABLE LA_donne_lieu_a_LC ADD FOREIGN KEY (numero_lda) REFERENCES Ligne_d_achat (numero_lda);
ALTER TABLE LA_donne_lieu_a_LC ADD FOREIGN KEY (numero_ldc) REFERENCES Ligne_de_commande (numero_ldc);
ALTER TABLE Stocker ADD FOREIGN KEY (id_site) REFERENCES Site (id_site);
ALTER TABLE Stocker ADD FOREIGN KEY (reference_interne) REFERENCES Produit_Interne (reference_interne);

View file

@ -0,0 +1,22 @@
-- AccessLevel : --
-- 1 : root --
-- 2 : acheteur --
-- 4 : magazinier --
-- 8 : guest (read-only) --
-- Category : --
-- 1 : acheteur --
-- 2 : magazinier --
-- 4 : none --
CREATE TABLE Users (
login varchar(32) NOT NULL,
pass varchar(250) NOT NULL,
accesslevel int NOT NULL,
category varchar(4) NOT NULL,
idcat int
);
ALTER TABLE Users ADD PRIMARY KEY (login);

21
sql/db-drop.sql Normal file
View file

@ -0,0 +1,21 @@
drop table Acheteur;
drop table Commande;
drop table Fournisseur;
drop table Livraison;
drop table Magasinier;
drop table ProduitFour;
drop table Produit_Interne;
drop table Reception;
drop table Site;
drop table Stocker;
drop table Users;
drop table Famille_de_produit;
drop table Etats_LA;
drop table LigneLivraison;
drop table LigneReception;
drop table Ligne_d_achat;
drop table Ligne_de_commande;
drop table Demande_d_achat;
drop table LA_donne_lieu_a_LC;
drop table Concerne;

21
sql/db-fill-commande.sql Normal file
View file

@ -0,0 +1,21 @@
INSERT INTO Commande(date, date_livraison, heure_livr_min, heure_livr_max, numero_com, id_acheteur, id_fournisseur)
VALUES (16/09/2004,16/09/2004,'15:00','16:00',1,1,1);
INSERT INTO Commande(date, date_livraison, heure_livr_min, heure_livr_max, numero_com, id_acheteur, id_fournisseur)
VALUES (16/09/2004,24/10/2004,'10:00','12:00',2,2,1);
INSERT INTO Commande(date, date_livraison, heure_livr_min, heure_livr_max, numero_com, id_acheteur, id_fournisseur)
VALUES (16/09/2004,24/10/2004,'10:00','12:00',3,2,'BMS');
INSERT INTO Commande(date, date_livraison, heure_livr_min, heure_livr_max, numero_com, id_acheteur, id_fournisseur)
VALUES (23/08/2004,28/09/2004,'14:00','15:00',4,2,'GNU');
INSERT INTO Commande(date, date_livraison, heure_livr_min, heure_livr_max, numero_com, id_acheteur, id_fournisseur)
VALUES (08/07/2003,10/10/2003,'10:00','12:00',5,2,'3');
INSERT INTO Commande(date, date_livraison, heure_livr_min, heure_livr_max, numero_com, id_acheteur, id_fournisseur)
VALUES (07/06/2004,10/06/2004,'13:00','17:00',6,2,'3');

21
sql/db-fill-demandeDA.sql Normal file
View file

@ -0,0 +1,21 @@
INSERT INTO Demande_d_achat(date, numero_da, id_magasinier)
VALUES (10/12/2003,1,1);
INSERT INTO Demande_d_achat(date, numero_da, id_magasinier)
VALUES (16/09/2004,2,2);
INSERT INTO Demande_d_achat(date, numero_da, id_magasinier)
VALUES (23/07/2004,3,3);
INSERT INTO Demande_d_achat(date, numero_da, id_magasinier)
VALUES (26/08/2004,4,3);
INSERT INTO Demande_d_achat(date, numero_da, id_magasinier)
VALUES (27/09/2004,5,4);
INSERT INTO Demande_d_achat(date, numero_da, id_magasinier)
VALUES (05/10/2004,6,4);
INSERT INTO Demande_d_achat(date, numero_da, id_magasinier)
VALUES (05/10/2003,6,4);
INSERT INTO Demande_d_achat(date, numero_da, id_magasinier)
VALUES (15/10/2003,7,6);

View file

@ -0,0 +1,19 @@
-- Remplir la table des Famille_de_produit avec les informations sur les Famille_de_produit --
-- 1 - Aciers et fontes
-- 2 - Métaux non ferreux
-- 3 - Produits chimiques
-- 4 - Outillage et divers
INSERT INTO Famille_de_produit (reference_fam, nom_fam, id_acheteur)
VALUES ('1','Aciers et fontes','01');
INSERT INTO Famille_de_produit (reference_fam, nom_fam, id_acheteur)
VALUES ('2','Métaux non ferreux','02');
INSERT INTO Famille_de_produit (reference_fam, nom_fam, id_acheteur)
VALUES ('3','Produits chimiques','03');
INSERT INTO Famille_de_produit (reference_fam, nom_fam, id_acheteur)
VALUES ('4','Outillage et divers','04');

View file

@ -0,0 +1,12 @@
INSERT INTO Fournisseur (nom, adresse, telephone, fax, SIRET, SIREN,id_fournisseur, reference_fam)
VALUES ('Duppont','66 rue Jussieu', 0140002727, 0140002345,'4A474-985A23','I234lpi-45p',1,3);
INSERT INTO Fournisseur (nom, adresse, telephone, fax, SIRET, SIREN,id_fournisseur, reference_fam)
VALUES ('Blik','37 rue Blanchette', 009485327, 019432345,'4Anfkd-5A23','I-lpi-45p',2,3);
INSERT INTO Fournisseur (nom, adresse, telephone, fax, SIRET, SIREN,id_fournisseur, reference_fam)
VALUES ('Francoisette','37 rue duchamps', 64509947, 049590345,'hjd-m44d-5A23','456IO-45p',3,3);
INSERT INTO Fournisseur (nom, adresse, telephone, fax, SIRET, SIREN,id_fournisseur, reference_fam)
VALUES ('Carlosse','37 rue elysee', 0154546785, 0156778488,'ZZZ5-34d-5A67','677GF-45YU',4,3);

View file

@ -0,0 +1,10 @@
INSERT INTO Ligne_d_achat(numero_lda, numero_da, reference_interne, quantite)
VALUES (3,4,'A72',260);
INSERT INTO Ligne_d_achat(numero_lda, numero_da, reference_interne, quantite)
VALUES (4,3,'AC45',300);
INSERT INTO Ligne_d_achat(numero_lda, numero_da, reference_interne, quantite)
VALUES (5,2,'A77',780);
INSERT INTO Ligne_d_achat(numero_lda, numero_da, reference_interne, quantite)
VALUES (6,6,'A43',978);
INSERT INTO Ligne_d_achat(numero_lda, numero_da, reference_interne, quantite)
VALUES (7,1,'A33',780);

View file

@ -0,0 +1,20 @@
INSERT INTO Ligne_de_commande(numero_ldc, numero_com, reference_fournisseur, quantite)
VALUES (1,1,'FOO1',145);
INSERT INTO Ligne_de_commande(numero_ldc, numero_com, reference_fournisseur, quantite)
VALUES (2,2,'FOO2',770);
INSERT INTO Ligne_de_commande(numero_ldc, numero_com, reference_fournisseur, quantite)
VALUES (3,2,'FOO3',500);
INSERT INTO Ligne_de_commande(numero_ldc, numero_com, reference_fournisseur, quantite)
VALUES (4,1,'FOO2',65);
INSERT INTO Ligne_de_commande(numero_ldc, numero_com, reference_fournisseur, quantite)
VALUES (5,6,'FOO2',90);
INSERT INTO Ligne_de_commande(numero_ldc, numero_com, reference_fournisseur, quantite)
VALUES (6,5,'FOO1',480);
INSERT INTO Ligne_de_commande(numero_ldc, numero_com, reference_fournisseur, quantite)
VALUES (7,3,'FOO1',100);
INSERT INTO Ligne_de_commande(numero_ldc, numero_com, reference_fournisseur, quantite)
VALUES (8,3,'FOO3',800);
INSERT INTO Ligne_de_commande(numero_ldc, numero_com, reference_fournisseur, quantite)
VALUES (9,3,'FOO4',520);
INSERT INTO Ligne_de_commande(numero_ldc, numero_com, reference_fournisseur, quantite)
VALUES (10,4,'FOO4',260);

View file

@ -0,0 +1,22 @@
INSERT INTO ProduitFour (reference_fournisseur, designation, prix, id_fournisseur,reference_interne)
VALUES ('Four1','Vis a tête fraise',23,'1', 'M56');
INSERT INTO ProduitFour (reference_fournisseur, designation, prix, id_fournisseur,reference_interne)
VALUES ('F002','Ecrou de 3 a tete fraisa',6,'2', 'M56');
INSERT INTO ProduitFour (reference_fournisseur, designation, prix, id_fournisseur,reference_interne)
VALUES ('F003','Embou file D18',91,'1', 'M56');
INSERT INTO ProduitFour (reference_fournisseur, designation, prix, id_fournisseur,reference_interne)
VALUES ('F004','Racord baisse pression',72,'3','P2');
INSERT INTO ProduitFour (reference_fournisseur, designation, prix, id_fournisseur,reference_interne)
VALUES ('F005','Petit verin',68,'4', 'P2');
INSERT INTO ProduitFour (reference_fournisseur, designation, prix, id_fournisseur,reference_interne)
VALUES ('F006','Pigon',56,'2', 'P2');

View file

@ -0,0 +1,49 @@
-- Remplir la table des Produit_Interne avec les informations sur les Produit_Interne --
-- reference_fam est la reference_fam de la famille de produit
-- 1 - Aciers et fontes
-- 2 - Métaux non ferreux
-- 3 - Produits chimiques
-- 4 - Outillage et divers
-- Aciers et fontes
INSERT INTO Produit_Interne (reference_interne, designation, reference_fam)
VALUES ('A059','arbre flex','1');
INSERT INTO Produit_Interne (reference_interne, designation, reference_fam)
VALUES ('F109','fer solide','1');
INSERT INTO Produit_Interne (reference_interne, designation,reference_fam)
VALUES ('T059','titane','1');
-- Métaux non ferreux
INSERT INTO Produit_Interne (reference_interne, designation,reference_fam)
VALUES ('A72','Plaque aluminium','2');
INSERT INTO Produit_Interne (reference_interne, designation, reference_fam)
VALUES ('A07','Aluminium AC04','2');
-- Produits chimiques
INSERT INTO Produit_Interne (reference_interne, designation, reference_fam)
VALUES ('Ac56','Acide corrosif', '3');
INSERT INTO Produit_Interne (reference_interne, designation, reference_fam)
VALUES ('D01','Disolvant', '3');
INSERT INTO Produit_Interne (reference_interne, designation, reference_fam)
VALUES ('D78','Diluant', '3');
-- Outillage et divers
INSERT INTO Produit_Interne (reference_interne, designation, reference_fam)
VALUES ('M56','Marteau', '4');
INSERT INTO Produit_Interne (reference_interne, designation, reference_fam)
VALUES ('P23','Perceuse', '4');
INSERT INTO Produit_Interne (reference_interne, designation, reference_fam)
VALUES ('B001','Burin', '4');
INSERT INTO Produit_Interne (reference_interne, designation, reference_fam)
VALUES ('P2','Ensemble outils de precision', '4');

12
sql/db-fill-site.sql Normal file
View file

@ -0,0 +1,12 @@
INSERT INTO Site(id_site,nom,adresse,telephone,fax)
Values(4,'Usine Bouchard','45 rue Saint Honoré 75012','0140051595','0140051056');
INSERT INTO Site(id_site,nom,adresse,telephone,fax)
Values(5,'EquipeForce','36 allée des Genies Motreale','0454665687','0466049687');
INSERT INTO Site(id_site,nom,adresse,telephone,fax)
Values(6,'OutillageTop','125 av de Jean Jaures','0454665687','0466049687');
INSERT INTO Site(id_site,nom,adresse,telephone,fax)
Values(7,'OutilDemon','76 rue des astres','067686687','056749687');

15
sql/db-fill-sites.sql Normal file
View file

@ -0,0 +1,15 @@
-- Remplir la table des sites avec les informations sur les sites --
-- 1 - Siège
-- 2 - Usine Pont-Quéau
-- 3 - Usine Boulogne
INSERT INTO Site (id_site,nom, adresse, telephone, fax)
VALUES ('1','Siège','22 rue des petits bois','0142028035','0145360485');
INSERT INTO Site (id_site,nom, adresse, telephone, fax)
VALUES ('2','Usine Pont-Quéau','21 allée de Menfouest, Pont-Quéau 29180 Plogonnec','0242028035','0145360485');
INSERT INTO Site (id_site,nom, adresse, telephone, fax)
VALUES ('3','Usigne Boulogne','230 rue Damocles, 92350 Boulogne','0142070809','0142070809');

34
sql/db-fill-users.sql Normal file
View file

@ -0,0 +1,34 @@
--
INSERT INTO Users (login, pass, accesslevel, category, idcat)
VALUES ('emile.baud', 'd6af45a5d57343e2943460d318d7de4b', '15', 'OTH','3');
-- login : emile.baud / kingofziuniverse --
--
INSERT INTO Acheteur (nom, prenom, adresse, telephone, fax, id_site)
VALUES ('Pierre', 'D\'Angle', '27 place des Dolmen', '0116336110', '0123456789', '1');
INSERT INTO Users (login, pass, accesslevel, category, idcat)
VALUES ('pierre.dangle', '9e8e37aeb4449d579e9a58ce02e9f2fd', '1', 'ACH', '1');
-- login: pierre.dangle / password : bicycle --
--
INSERT INTO Acheteur (nom, prenom, adresse, telephone, fax, id_site)
VALUES ('Charles', 'Roy', '27 rue du Trone', '0216736110', '0143436681', '1');
INSERT INTO Users (login, pass, accesslevel, category, idcat)
VALUES ('charles.roy', 'b6d46f2791b61b4ad114b4183049b39c', '1', 'ACH', '2');
-- login: charles.roy / password : charles.roy --
--
INSERT INTO Magasinier (nom, prenom, adresse, telephone, fax, id_site)
VALUES ('Bob', 'Legras', '151 avenue Mayo', '0452361105', '0141239841', '1');
INSERT INTO Users (login, pass, accesslevel, category, idcat)
VALUES ('monsieur.legras', '183840772d3a679f148b590e35200a7f', '2', 'MAG', '2');
-- login: monsieur.legras / password : monsieur.legras --
--
INSERT INTO Magasinier (nom, prenom, adresse, telephone, fax, id_site)
VALUES ('Jules', 'Schtöjninczec', '151 avenue du Tripalium', '0452361105', '0141239841', '1');
INSERT INTO Users (login, pass, accesslevel, category, idcat)
VALUES ('monsieur.jules', '183840772d3a679f148b590e35200a7f', '2', 'MAG', '2');
-- login: monsieur.legras / password : monsieur.legras --

73
sql/drop.php Normal file
View file

@ -0,0 +1,73 @@
<?php
/*
* Script d'installation de D'Astre.Net
* -------------------------------------
*
* A exécuter pour :
* - créer les tables de la base de donnée
* - remplir avec des valeurs par défaut (démonstration).
*/
$include_path=ini_get('include_path');
$include_path.=":../includes:../config";
ini_set('include_path', $include_path);
require("db.conf.php");
require("libdbmanip.inc.php");
print "<html>\n";
print "<head>\n";
print "<title>D'Astre.Net : Script d'installation </title>\n";
print "<style type='text/css'>";
?>
span.good {
color: green;
font-weight: bold;
}
span.bad{
color: red;
font-weight: bold;
}
.code {
font-family: courier, mono;
background: #eee;
padding:0px;
margin:0px;
margin-left:20px;
margin-right:20px;
margin-top: 10px;
}
.msg {
padding:0px;
margin:0px;
margin-left:20px;
margin-right:20px;
margin-bottom:5px;
background: #ddd;
text-align: center;
}
div.traitement{
max-height: 300px;
overflow: auto;
}
<?php
print "</style>";
print "</head>";
print "<body>";
echo "$include_path<br />";
echo "<b>SQL_SERVER:</b> ".SQL_SERVER."<br />";
echo "<b>SQL_USER:</b> ".SQL_USER."<br />";
$files=array(
"db-drop.sql"
);
executeSQLFiles($files);
print "</body></html>";
?>

85
sql/install.php Normal file
View file

@ -0,0 +1,85 @@
<?php
/*
* Script d'installation de D'Astre.Net
* -------------------------------------
*
* A exécuter pour :
* - créer les tables de la base de donnée
* - remplir avec des valeurs par défaut (démonstration).
*/
$include_path=ini_get('include_path');
$include_path.=":../includes:../config";
ini_set('include_path', $include_path);
require("db.conf.php");
require("libdbmanip.inc.php");
print "<html>\n";
print "<head>\n";
print "<title>D'Astre.Net : Script d'installation </title>\n";
print "<style type='text/css'>";
?>
span.good {
color: green;
font-weight: bold;
}
span.bad{
color: red;
font-weight: bold;
}
.code {
font-family: courier, mono;
background: #eee;
padding:0px;
margin:0px;
margin-left:20px;
margin-right:20px;
margin-top: 10px;
}
.msg {
padding:0px;
margin:0px;
margin-left:20px;
margin-right:20px;
margin-bottom:5px;
background: #ddd;
text-align: center;
}
div.traitement{
max-height: 300px;
overflow: auto;
}
<?php
print "</style>";
print "</head>";
print "<body>";
echo "$include_path<br />";
echo "<b>SQL_SERVER:</b> ".SQL_SERVER."<br />";
echo "<b>SQL_USER:</b> ".SQL_USER."<br />";
$files=array(
"db-create-mcd.sql",
"db-create-table-users.sql",
"db-alter-inc.sql",
"db-fill-sites.sql",
"db-fill-users.sql",
"db-fill-famille_produit.sql",
/* "db-fill-fournisseur.sql", */
"db-fill-produit_interne.sql",
/* "db-fill-produit_extern.sql", */
/* "db-fill-magasinier.sql", */
/* "db-fill-acheteur.sql", */
/* "db-fill-demandeDA.sql", danger rivka */
"db-fill-site.sql",
);
executeSQLFiles($files);
print "</body></html>";
?>

78
sql/libdbmanip.inc.php Normal file
View file

@ -0,0 +1,78 @@
<?php
if (!defined("LIBDBMANIP_INC")){
define(LIBDBMANIP_INC,1);
if (!function_exists('file_get_contents'))
{
function file_get_contents($filename, $use_include_path = 0)
{
$file = @fopen($filename, 'rb', $use_include_path);
if ($file) {
if ($fsize = @filesize($filename)) { $data = fread($file, $fsize); }
else {
while (!feof($file)) {$data .= fread($file, 1024);}
}
fclose($file);
}
return $data;
}
} // exist function
function executeSQLFiles($files){
$connexion = @mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD);
if (!$connexion) {
echo "Erreur serveur mysql $connexion :";
print mysql_error($connexion);
} else {
foreach ($files as $file) {
print "<h2>Traitement de $file...</h2>\n";
print "<div class='traitement'>\n";
/*="db-create-mcd.sql"; */
if (is_file($file)){
$sqlfile=file_get_contents($file);
$queries=split("[\n\r]",$sqlfile);
foreach ($queries as $query){
if (preg_match('/^\s*--/',$query)){
/* ne rien faire */
$oldq="";
} else {
if (preg_match('/;\s*$/',$query)){
// on récupere les vieux morceaux //
$query=$oldq.$query;
$oldq="";
$query=preg_replace('/\s+/',' ',$query);
$query=preg_replace('/;\s*$/','',$query);
$query=preg_replace('/;\s*$/','',$query);
print "<p class='code'>";
print "\n$query\n";
print "</p>\n";
print "<p class='msg'>\n";
$result=mysql_db_query(SQL_BASE,$query,$connexion);
if (!$result){
echo "<span class='bad'>\nErreur :";
print mysql_error($connexion);
print "\n</span>\n";
} else {
echo "<span class='good'>Succès.</span>\n";
}
print "</p>\n";
} else {
$oldq=$oldq.$query;
//print "$oldq<br/>";
}
}
}
} else {
echo "<span class='bad'>"
. "Erreur : Le fichier $file n'existe pas !</span></p>";
}
print "</div>\n";
}
mysql_close($connexion);
}
}
}
?>

28
styles/columnContent.css Normal file
View file

@ -0,0 +1,28 @@
#columnContent {
position: absolute;
top: 60px;
left: 210px;
right: 10px;
}
#columnContent h1 {
clear:both;
left: 0px;
right: 0px;
border: 0px none #000;
border-bottom: 2px solid #00f;
text-align: left;
color:#a00;
}
#columnContent h2 {
clear:both;
left: 0px;
right: 0px;
border: 0px none #000;
border-bottom: 1px solid #00f;
text-align: left;
}

87
styles/contenu.css Normal file
View file

@ -0,0 +1,87 @@
#contenu {
float:top;
display:block;
border: 1px dashed #000;
padding: 10px;
background: white;
}
#contenu form input {
background-color: #eef;
border: 1px solid #999; /* solid */
}
#contenu legend img {
/* float: left; */
border: 0px none #000;
margin: 0px;
margin-left: 5px;
margin-right: 10px;
}
#contenu legend a {
display:inline;
color:blue;
font-weight: bold;
left: 0px;
right;
}
#contenu legend a:hover {
background:#fc9;
left: 0px;
right: 0px;
}
#contenu form .info {
width: 150px;
margin: 1px;
height: 2em;
background: #ccc;
font-weight: bold;
margin-left: auto;
}
#contenu form input.good {
width: 100px;
height: 2em;
background: #afa;
}
#contenu form input.bad {
width: 100px;
height: 2em;
background: #faa;
left: 0px;
right: 0px;
text-align:center;
}
#contenu input.chkbox {
height: 16px;
width: 16px;
background: #aaf;
}
#contenu p img {
float: left;
border: 0px none #000;
margin: 0px;
margin-left: 15px;
margin-right: 10px;
}
#contenu p a {
display:block;
color:blue;
font-weight: bold;
left: 0px;
right;
}
#contenu p a:hover {
background:#fc9;
left: 0px;
right: 0px;
}

34
styles/contenuDA.css Normal file
View file

@ -0,0 +1,34 @@
#contenuDA {
float:top;
display:block;
border: 1px dashed #000;
padding: 10px;
background: white;
}
#contenuDA form .info {
/* width: 150px; */
margin: 1px;
height: 2em;
background: #ccc;
font-weight: bold;
margin-left: auto;
}
input.livraison {
margin-left: 2px;
margin-right: 2px;
}
span.DAproduit {
font-weight: bold;
}
span.DAfamille {
font-style: italic;
}

34
styles/footer.css Normal file
View file

@ -0,0 +1,34 @@
#footer {
float: top;
display:block;
padding: 10px;
text-align: center;
vertical-align: top;
font-family: helvetica, arial, sans-serif;
color: #fff;
font-weight: bold;
font-size: 90%;
}
#footer span.validator {
float: left;
width: 160px;
margin: 0px;
padding: 0px;
padding-right: 10px;
border: 0px none #000;
border-right: 1px dashed #fff;
}
#footer .validator a {
font-size: 90%;
display:block;
color:white;
text-decoration: none;
margin: 10px;
}
#footer .validator a:hover {
color: #ddf;
text-decoration: underline overline;
}

23
styles/header.css Normal file
View file

@ -0,0 +1,23 @@
#header {
top: 0px;
left: 0px;
right: 0px;
height: 40px;
color: white;
margin: 0px;
background: black;
border:0px;
border-bottom: 2px solid #fff;
}
#header h1 {
margin: 0px;
}
#header h1 img {
margin:0px;
margin-left:5px;
margin-right: 10px;
vertical-align: middle;
}

85
styles/main.css Normal file
View file

@ -0,0 +1,85 @@
body {
background: #444;
background-image: url("/images/background.jpg");
background-repeat: repeat-both;
margin: 0px;
padding: 0px;
}
span.error {
display:block;
color :red;
font-weight: bold;
}
hr.spacer {
display:block;
visibility:hidden;
}
fieldset {
border-width: 2px;
}
select {
background-color: #ddf;
border: 1px solid #999; /* solid */
margin-left: auto;
margin-right: 10px;
text-align:center;
}
form input,fieldset input {
background-color: #ddf;
border: 1px solid #999; /* solid */
margin-left: auto;
margin-right: 10px;
text-align:center;
}
input[type=submit],input[type=reset] {
border-width: 2px;
}
input[type=checkbox], input[type=radio] {
width: 16px;
height: 16px;
}
fieldset {
-moz-border-radius: 7px;
-moz-border-width: 2px;
}
input.valider {
display:block;
float:center;
padding: 5px;
margin: 5px;
margin-left:auto;
margin-right:auto;
width: 300px;
color: #00a;
}
.ligne0 {
margin: 0px;
padding: 3px;
background: #ffffcc;
}
.ligne1 {
margin: 0px;
padding: 3px;
background: #ccffff;
}
span.id_da {
font-style:italic;
}
span.ref_in {
font-weight: bold;
}
span.designation {
font-weight: bold;
}

72
styles/menuGauche.css Normal file
View file

@ -0,0 +1,72 @@
#menuGauche {
position: absolute;
top: 60px;
left: 10px;
width: 170px;
padding:0px;
padding-left: 5px;
padding-right: 5px;
padding-bottom: 5px;
border: 1px dashed #000; /* inset */
background: white;
background-image: url(/images/bgmenubar.png);
background-repeat: repeat-y;
}
#menuGauche h1 {
font-size: 100%;
font-weight: bold;
text-align: center;
color: #fdd;
padding:0px;
margin: 0px;
margin-top: 5px;
padding-left:5px;
padding-right:5px;
border: 0px none #000;
/* border-top: 2px outset #f00;
border-right: 2px outset #f00;
border-bottom: 2px outset #f00; */
background: black;
}
#menuGauche ul {
padding: 0px;
padding-left:17px;
}
#menuGauche p {
clear:both;
padding: 0px;
left: 0px;
right: 0px;
}
#menuGauche p img {
float: left;
border: 0px none #000;
margin: 0px;
margin-left: 15px;
margin-right: 10px;
}
#menuGauche p a {
display:block;
color:blue;
font-weight: bold;
left: 0px;
right;
}
#menuGauche p a:hover {
background:#fc9;
left: 0px;
right: 0px;
}
#menuGauche input.searcher {
width: 120px;
margin-left: 30px;
background: #eef;
}

24
tools/cda-update Executable file
View file

@ -0,0 +1,24 @@
#!/bin/bash
SSH_USER=$1
if [ $SSH_USER="" ]; then
SSH_USER=$USER
fi
LOCAL_CDA_DIR=$(pwd)
DIST_CDA_DIR=/home/$SSH_USER/public_html/CDA/
DIST_CDA_SERV=ssh.shamox.ath.cx
echo -e "User : \t$SSH_USER"
echo -e "Local Dir : \t$LOCAL_CDA_DIR"
echo -e "Remote Dir : \t$DIST_CDA_DIR"
echo -e "Server : \t$DIST_CDA_SERV"
echo -e -n "Erasing previous version... "
ssh -C $DIST_CDA_SERV -- mkdir -p $DIST_CDA_DIR
ssh -C $DIST_CDA_SERV -- rm -r $DIST_CDA_DIR
echo -e "done"
echo -e "Updating current version... "
ssh -C $DIST_CDA_SERV -- mkdir -p $DIST_CDA_DIR
( cd $LOCAL_CDA_DIR; \
scp -C -r $LOCAL_CDA_DIR/* $SSH_USER@$DIST_CDA_SERV:$DIST_CDA_DIR )
echo -e "Update done"

5
tools/md5-gen.php Normal file
View file

@ -0,0 +1,5 @@
<?php
$md5pass=md5($_GET["pass"]);
print "<p style='border:2px solid #f00; padding: 15px;'>$md5pass</p>";
?>