[AngularJs + Php] Organiser un système de gestion de stock avec les triggers SQL. (CRUD)

logo-mysql-170x170_400x400 angularjsphp_1_.pnglogo

Introduction


J’ai décidé d’utiliser les triggers SQL afin de gérer le réassort de carburant dans mon application Pompestation. Les ventes de carburant sont aussi concernées par ce système.

Le but est de pouvoir créer un réassort de carburant, supprimer un réassort carburant et éventuellement mettre à jour un réassort de carburant(facultatif). En fait, il s’agit d’un CRUD qui agit sur les stocks de carburant. La même chose pour les ventes…

Une petite difficulté est que, si l’employé supprime le réassort carburant, évidemment, il faut soustraire  le volume de réassort à la citerne concernée, c’est également un trigger qui va le faire.

L’autre petite difficulté est qu’une citerne ne peut avoir volume inférieur à zéro et volume supérieur à volumecapaMax

Plutôt que de coder tout cela dans un langage front-end ou back-end, j’ai constaté que les triggers SQL semblent plus fiables parce que, étant intégrés à la base de données,ils  évitent d’éventuelles erreurs et coupures réseaux etc ..De plus, c’est surtout beaucoup plus simple à écrire.

Comme d’hab, je ne prétends pas apporter la meilleure solution, mais déjà de créer une solution fonctionnelle qui me permette de gérer tout type de stock. Le fait de décrire précisemment ce que je fais permettra d’apprécier plus facilement une meilleure solution à l’avenir, ou de corriger les problèmes.

La conception logique relationelle – SQL


Voici la conception logique relationnelle de ma gestion de Stock de Carburant actuelle (Ce sont les tables SQL qui vont me servir à gérer mes réassorts ET mes ventes de carburant) :

gestionstocks

– La table stockCarburant est en permanence à jour du calcul des stocks, afin d’être requêtée dans l’application, en AJAX.

– Les deux tables venteCarburant et reassortCarburant sont des « journaux »  de mouvements de stocks, avec donc une colonne date et heure (objet JS). Admettons que j’ai 5 stations services, et un total de 30 citernes, ces tables vont (en théorie) s’alourdir très rapidement de dizaines de lignes… Ces tables auraient également une valeur en cas de litige.

On peut déjà parler des 2 triggers sql  les plus simples à comprendre:

*1 trigger placé sur la table venteCarburant qui s’exécute lors d’une vente et qui décrémente le stock de x litres de carburant dans la table stockCarburant.
*1  trigger placé sur la table reassortCarburant qui s’exécute lors du remplissage de la citerne et qui incrémente le stock de x litres de carburant dans la table stockCarburant..

Tout cela toujours en fonction de idciterne, parce que il y a des dizaines de citernes différentes.

Question : »Mais tu es ‘ouf’, il faut faire une vue qui calcule le volume à l’instant T de chacune de tes citernes, plutôt que de faire ces  triggers tout compliqués!  »

Réponse : Lorsqu’il y aura 10 000 enregistrements, je vois mal la vue calculer le volume de chaque citerne à chaque fois, donc, je ne fais pas de vue calculée. Voilà pourquoi j’ai créé la table stockCarburant qui doit toujours être à jour des stocks .

La conception dans le code :



Prenons l’exemple du réassort de carburant :

Il y a besoin de  coder ceci pour que cela fonctionne :

  1. Une vue HTML qui permet à l’utilisateur d’entrer le volume en litres du réassort de carburant, et de spécifier la citerne de destination.
  2. Une requête du Serveur Back end qui enregistre dans la table SQL reassortCarburant le volume, l’id citerne ainsi que la date (Au format objet JS, ou pas)
  3. Un trigger qui incrémente le stock de la citerne ayant l’id citerne spécifié au point 2, ainsi que le volume spécifié au point 2.

La vue HTML : Voici un exemple partiel d’une vue  AngularJs permettant le réassort :

<div class="input-group">
	<span class="input-group-addon">Volume</span>
<input type="number" step="any" class="form-control" ng-model="reassortcarburant.volumereassort"    placeholder='0,00' required> </input> <!-- onkeypress="return preventDot(event);" -->
<span class="input-group-addon">Litres</span>

</div><span ng-show="capaDepassee" style="color:red">Capacité dépassée!</span><br>

<div class="input-group">
	<span class="input-group-addon">Cout au litre</span>
	<input type="number"  step="any" class="form-control" ng-model="reassortcarburant.cu"      placeholder='0,00' required> </input>
	<span class="input-group-addon">€</span>
</div><br>

<div class="input-group">
	<span class="input-group-addon">T.V.A</span>
	<input class="form-control"  ng-model="reassortcarburant.tva"  type="number" step='0.01'  placeholder='0.00' disabled> </input>
	<span class="input-group-addon">%</span>
</div><br>

<div class="input-group">
	<span class="input-group-addon">Cout total</span>
	<input  class="form-control" step="any" ng-model="reassortcarburant.ct()"     placeholder='0.00' disabled> </input>
	<span class="input-group-addon">€</span>
</div><br>


<div class="input-group">
	<span class="input-group-addon" >Fournisseur</span>
<ui-select  theme="select2" ng-model="reassortcarburant.idfournisseur"  ng-disabled="disabled" style="min-width: 100%;">
<ui-select-match placeholder="Selectionnez ...">{{$select.selected.nom}}</ui-select-match>
	<ui-select-choices repeat="fournisseur.id as fournisseur in fournisseurs | filter:{nom:$select.search}  "  >
		 <img ng-src="{{::fournisseur.image}}" class="imageX"/>
		 <div ng-bind-html="::fournisseur.nom | highlight: $select.search"></div>
	  <small ng-bind-html="::fournisseur.adresse | highlight: $select.search"></small>
	</ui-select-choices>
</ui-select>
</div>

Dans le controleur AngularJs, on aura la fonction $http POST habituelle de ce style qui envoie les données au back end :

/* Ajout en base de données */
		 if(u.role=='admin'){
		$http.post('crud.php?action=insert_reassortcarburant',$scope.reassortcarburant).success(function(data){
			$route.reload();
			notifier.notify("Le réassort a bien été pris en compte");
		}).error(function(data){ $scope.infos = " Pas de données ou pb de connexion"});
		 }
		else{
			notifier.notify('Vous devez être admin pour faire un réassort');
		}

Ensuite, le Back End PHP enregistre les données sur la table SQL reassortCarburant:


function insert_reassortcarburant() {
	/* Récupération des données POST */
	 $data = json_decode(file_get_contents("php://input")); 

	/* Insertion en Bdd avec PDO */
	try {
		$DB = connection();
		$req = $DB->prepare("INSERT INTO reassortcarburant VALUES (?,?,?,?,?,?,?,?)");
		$req->execute(array(null,$data->idciterne,$data->volumereassort,$data->dateajout,$data->idfournisseur,$data->cu,$data->ct,$data->tva));
		$DB=null;
	} catch (PDOException $e) {
		file_put_contents('PDOErreurs.txt', $e->getMessage(), FILE_APPEND);
		die();
	}
}

triggers3

Et, à partir du moment ou le sgbd MYSQL reçois cette requête en insertion, il déclenche alors le trigger AFTER INSERT suivant qui va incrémenter le stock de la citerne de la citerne concernée. Remarquer la syntaxe new, qui ‘récupère’ les données de la requête INSERT, c’est là toute l’astuce:


CREATE DEFINER=`root`@`localhost` TRIGGER Reassort AFTER INSERT ON reassortcarburant
FOR EACH ROW
UPDATE stockcarburant
SET stockcarburant.volume = stockcarburant.volume + new.volume
WHERE stockcarburant.idciterne = new.idciterne

A SUIVRE DEMAIN

Publicités