l3.cas-d-astre/doc/demandeAchat.tex

265 lines
11 KiB
TeX
Raw Normal View History

2009-05-01 08:39:36 +00:00
\section{Demande d'achat}
\par Les demande d'achats sont g<>r<EFBFBD>es gr<67>ce <20> 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<63>ation de la
Demande d'achat, la variable de session \verb+$_SESSION["demandeAchat]"+ contient l'objet {\em DemandeAchat} correspondant <20> la demande en cours de cr<63>ation.
\par Enfin, la classe {\em DemandeAchat} est compos<6F>e d'une liste de {\em LDachat}, qui correspondent aux lignes de demande d'achat.
\subsection{Classe LDachat}
\par Comme dit pr<70>cedemment, cette classe repr<70>sente
une ligne d'achat. Elle est cr<63><72>e lorsque le magasinier
a choisi {\it ``Ajouter"} sur la page de cr<63>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<70>sentant la famille de produits du produit
selectionn<EFBFBD>, la r<>f<EFBFBD>rence interne du produit, la quantit<69> souhait<69>e et finalement le num<75>ro de demande d'achat
rattach<EFBFBD>. Tous ces champs sont initialis<69>s gr<67>ce au constructeur.
\subsection{Classe DemandeAchat}
\par Cette classe permet d'avoir un objet qui contient toutes les informations utiles pour pouvoir cr<63>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 <20> l'identifiant du magasinier qui passe commande}
\item{cr<EFBFBD>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<71>te
sur la base de donn<6E>es
avec le num<75>ro de demande d'achat souhait<69>.
\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<6E>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<66>
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 <20> l'<27>cran}
\par Pour afficher une demande d'achat on utilise la fonction \verb+toHTML($editable=0)+. Le param<61>tre sert
uniquement pour diff<66>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<70>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<6E>es}
\par Pour ins<6E>rer une demande d'achat, il suffit de faire appel <20> la fonction \verb+insereBD()+. Celle-ci, ins<6E>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 <20> la bonne mise en place des demandes d'achats.
\subsubsection{Les menus d<>roulants}
\par Il y a deux fonctions qui cr<63>ent des menus d<>roulants :
\begin{description}
\item{\verb+menu_deroulant_Produits($ref_int,$designation)+} Celle-ci concat<61>ne les deux cha<68>nes de caract<63>res
(r<>f<EFBFBD>rence interne et d<>signation du produit) pass<73>es en arguments et en cr<63>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<65>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<EFBFBD>tes}
\par Deux fonctions interagissent avec la base de donn<6E>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<EFBFBD>rence interne d'un
produit, ainsi que sa d<>signation, appartenant <20> la famille de produits pass<73>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 <20> 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<63>es dans la base de donn<6E>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<70>c<EFBFBD>dents}
\par Cet exemple est tir<69> du fichier \verb+DAajoute.php+ et montre l'utilisation des fonctions d<>crites pr<70>c<EFBFBD>dement.
Le code qui suit gen<65>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 <20> jour (sans devoir recharger la page) pour montrer les produits appartenant <20> la nouvelle famille de produits selectionn<6E>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 <20>
avoir une liste de demandes d'achats, utile pour la page \verb+DAliste.php+, car dans cette page on est amen<65> <20>
afficher toutes les demandes d'achats dont les lignes d'achat ont un certain <20>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<63>ation du tableau, l'identifiant du magasinier et le libell<6C> de l'<27>tat des lignes d'achats voulues.
\subsubsection{Ajout et suppression <20> diff<66>rentes <20>chelles}
\par Pour ce qui est de l'ajout, fonction \verb+ajouteLDA($da)+, on ajoute la demande d'achat pass<73>e en param<61>tre, au
tableau qui contient toutes les demandes d'acahts, sans oublier d'incr<63>menter le nombre de demandes d'achats contenues.
\par Quand <20> la suppression, fonction \verb+supprimeDA(...)+, on regarde les demandes d'achats <20> supprimer
(tableau pass<73> en argument) et ensuite on fait des suppressions succesives dans la base de donn<6E>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<71>te pour trouver toutes les demandes d'achats corespondant au
champ libell<6C> de l'objet. Pour chaque r<>sultat trouv<75>, on cr<63>e une nouvelle demande d'achat qu'on ins<6E>re dans la
liste des demandes d'achats. Cette fonction sert <20> ``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()+.